2017-03-14 95 views
0

我想了解C#mvvm和wpf,所以我決定做一個簡單的項目(一本書&讀者管理圖書館的應用程序),現在我有點迷路了,所以我真的很感謝一些幫助。 在我看來,我有一個列表視圖顯示讀者,以及綁定到列表視圖(名稱,地址等)的選定項目的一堆文本框。 listview綁定到一個可觀察的讀取器集合,這些讀取器使用Linq2SQL從數據庫表(讀者)創建。WPF MVVM清除文本框綁定到ListView SelectedItem

在文本框下方我有幾個按鈕(清除/添加/保存/刪除)。

我遇到的問題是,如果我嘗試執行某些命令,當我單擊按鈕時,listview的「selected item」,似乎爲null。

  • 當我點擊清除按鈕,如果我有選擇的項目(讀者)斷點,這表明它得到空/空的間隔,但文本框不明確; 如果使用的清除方法SelectedReader財產,並指定空的空間,以它的屬性,在列表視圖中選擇的項目也清除(因爲它綁定到讀者FullName屬性)

  • 我已經添加了新的其他問題讀者,並保存更改,我假設它由於錯誤的linq查詢,但我希望我可以修復當前的並繼續前進。

我該怎麼辦?

視圖模型

public class MainWindowViewModel : ViewModelBase 
{ 
    private Reader selectedReader;  

    private ObservableCollection<Reader> readerList; 

    public MainWindowViewModel() 
    { 
     SelectedReader = new Reader() 
         { 
          FullName = "", 
          SerialNumber = "", 
          IdNumber = "", 
          Adress = "", 
          AltContactMethods = "" 
         }; 

     BookDBDataContext rdb = new BookDBDataContext(); 
     ReadersList = new ObservableCollection<Reader>(rdb.Readers); 

     AddR = new TblQryCommand(AddToDb); 
     EditR = new TblQryCommand(EditToDb); 
     DeleteR = new TblQryCommand(DeleteFromDb); 
     ClearR = new TblQryCommand(ClearReaderFields); 
    } 

    public TblQryCommand AddR { get; private set; } 
    public TblQryCommand EditR { get; private set; } 
    public TblQryCommand DeleteR { get; private set; } 
    public TblQryCommand ClearR { get; private set; } 

    //Reader List 
    public ObservableCollection<Reader> ReadersList 
    { 
     get { return readerList; } 
     set 
     { 
      if (readerList != value) 
      { 
       readerList = value; 
       RaisePropertyChanged(); 
      } 
     } 
    } 

    public Reader SelectedReader 
    { 
     get { return selectedReader; } 
     set 
     { 
      if (selectedReader != value) 
      { 
       selectedReader = value; 
       RaisePropertyChanged(); 
      } 
     } 
    } 

    public void AddToDb() 
    { 
     BookDBDataContext db = new BookDBDataContext(); 
     Reader r = new Reader 
     { 
      FullName = SelectedReader.FullName, 
      SerialNumber = SelectedReader.SerialNumber, 
      IdNumber = SelectedReader.IdNumber, 
      Adress = SelectedReader.Adress, 
      AltContactMethods = SelectedReader.AltContactMethods 
     }; 

     db.Readers.InsertOnSubmit(r); 
     db.Readers.Context.SubmitChanges(); 
    } 

    public void DeleteFromDb() 
    { 

    } 

    public void EditToDb() 
    { 

    } 

    public void ClearReaderFields() 
    { 
     SelectedReader = new Reader 
     { 
      Id = 0, 
      FullName = string.Empty, 
      SerialNumber = string.Empty, 
      IdNumber = string.Empty, 
      Adress = string.Empty, 
      AltContactMethods = string.Empty 
     }; 
    } 

查看:

 <ListView Name="listviewReaders" ItemsSource="{Binding ReadersList}" SelectedItem="{Binding SelectedReader,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="140" Height="180" Margin="10,68,492,281"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding FullName}" /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 


    <TextBox x:Name="txtBxFullName" HorizontalAlignment="Left" Height="22" Margin="211,68,0,0" TextWrapping="Wrap" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.FullName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" VerticalAlignment="Top" Width="315"/> 
     <TextBox x:Name="txtBxSerialNumber" HorizontalAlignment="Left" Height="22" Margin="211,95,0,0" TextWrapping="Wrap" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.SerialNumber, Mode=TwoWay, UpdateSourceTrigger=Explicit}" VerticalAlignment="Top" Width="315"/> 
     <TextBox x:Name="txtBxIdNumber" HorizontalAlignment="Left" Height="22" Margin="211,122,0,0" TextWrapping="Wrap" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.IdNumber, Mode=TwoWay, UpdateSourceTrigger=Explicit}" VerticalAlignment="Top" Width="315"/> 
     <TextBox x:Name="txtBxAdress" HorizontalAlignment="Left" Height="22" Margin="211,149,0,0" TextWrapping="Wrap" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.Adress, Mode=TwoWay, UpdateSourceTrigger=Explicit}" VerticalAlignment="Top" Width="315"/> 
     <TextBox x:Name="txtBxAltContactMethods" HorizontalAlignment="Left" Height="22" Margin="211,176,0,0" TextWrapping="Wrap" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.AltContactMethods, Mode=TwoWay, UpdateSourceTrigger=Explicit}" VerticalAlignment="Top" Width="315"/> 

<Button x:Name="btnReader_Clear" Content="Clear" Command="{Binding ClearR}" HorizontalAlignment="Left" Margin="211,228,0,0" VerticalAlignment="Top" Width="75"/> 
    <Button x:Name="btnReader_Save" Content="Save" Command="{Binding EditR}" HorizontalAlignment="Left" Margin="291,228,0,0" VerticalAlignment="Top" Width="75"/> 
    <Button x:Name="btnReader_Add" Content="Add New" Command="{Binding AddR}" HorizontalAlignment="Left" Margin="371,228,0,0" VerticalAlignment="Top" Width="75"/> 
    <Button x:Name="btnReader_Delete" Content="Delete" Command="{Binding DeleteR}" HorizontalAlignment="Left" Margin="451,228,0,0" VerticalAlignment="Top" Width="75"/> 

回答

0

您是否嘗試過的文本屬性的Binding你的文本框設置爲直接在視圖模型的SelectedReader,物業? 因此,而不是寫這個:

<TextBox x:Name="txtBxFullName" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.FullName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" ... /> 

你可以這樣寫:

<TextBox x:Name="txtBxFullName" Text="{Binding Path=SelectedReader.FullName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" ... /> 
+0

謝謝你,它的工作原理! – Alex