2014-07-03 85 views
0

我嘗試將我的數據網格中的選定項綁定到某些文本框。 不幸的是,文本框不會在更改時更新。將數據網格項綁定到文本框

如果您需要更多信息請隨時諮詢。

在我看來,我嘗試將Datagrid的選定項的數據綁定到文本框。 在文本框中可以有一個您想要添加的新員工或您想要編輯的Datagrid之一。

<TextBox Name="TxtName" Text="{Binding Employee.LastName}" Grid.Column="1" Grid.Row="0"></TextBox> 
    <TextBox Name="TxtFirstName" Text="{Binding Employee.FirstName}" Grid.Column="3" Grid.Row="0"></TextBox> 
    <TextBox Name="TxtDateOfBirth" Text="{Binding Employee.DateOfBirth, StringFormat=d}" Grid.Column="1" Grid.Row="1"></TextBox> 
    <ComboBox Name="CmbGender" SelectedItem="{Binding Employee.Gender}" ItemsSource="{Binding Genders}" DisplayMemberPath="Short" Grid.Column="3" Grid.Row="1"/> 


    <DataGrid Name="GrdAllEmployees" ItemsSource="{Binding Employees}" SelectedItem="{Binding SelectedEmployee}" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="4" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{Binding SelectionChanged}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </DataGrid> 

在我的ViewModel中,我將所選員工的值設置爲文本框中顯示的員工,併爲兩者提高事件。

 public Employee SelectedEmployee 
     { 
      get { return _selectedEmployee; } 
      set 
      { 
       _selectedEmployee = value; 
       NotifyPropertyChanged("SelectedEmployee"); 
       _employee = _selectedEmployee; 
       NotifyPropertyChanged("Employee"); 
      } 
     } 

之後,這些值在調試時是正確的。但視圖不會更新。

+0

因此,當您在「DataGrid」中更改所選項目時,會觸發'SelectedEmployee' setter? – dkozl

+1

改善問題並讓人們閱讀它的好方法(它可能實際上幫助你自己解決問題)是儘可能多地刪除代碼,直到刪除更多的代碼不會再現問題,然後再發布它。 – franssu

+0

@ Boot750還可以確定在綁定'SelectedEmployee'時設置哪個值,它更新'Employee'屬性,並且還觸發'SelectionChanged'命令,該命令也是'Employee = _selectedEmployee;' – dkozl

回答

0

我替換了我自己的RelayCommand和ViewModelBase的類和MVVMlight,我從nuget下載後,它工作。

https://mvvmlight.codeplex.com/

我剛剛和RaisePropertyChanged改變NotifyPropertyChanged。

但也要感謝@Sheridan的建議。

1

顯示DataGrid的選定項目中的值或實際上WPF中的任何收集控件的方法都簡單得多。那就是使用Selector.IsSynchronizedWithCurrentItem property。如果將此設置爲true,則可以使用/表示法,即當前項目來從該集合中引用所選項目。嘗試是這樣的:

<StackPanel> 
    <DataGrid ItemsSource="{Binding Employees}" IsSynchronizedWithCurrentItem="True" /> 
    <TextBlock Text="{Binding Employees/Name}" /> 
</StackPanel> 

這從DataGrid當前選擇的項目顯示Name屬性值。進一步的信息...從Binding.Path Property頁上MSDN:

當源是一個集合視圖,當前項可以用斜線(/)指定。例如,子句Path = /設置綁定到視圖中的當前項目。當源是集合時,此語法指定默認集合視圖的當前項目。

屬性名稱和斜線可以組合來遍歷作爲集合的屬性。例如,Path =/Offices/ManagerName指定源集合的當前項目,其中包含也是集合的Offices屬性。其當前項目是一個包含ManagerName屬性的對象。

+0

感謝您的快速回復。有了這個代碼,我可以在我的文本框中顯示選定的值。我希望用戶有可能通過此屏幕添加新員工或更新列表中的一個。爲此,我創建了SelectedEmployee屬性,如果用戶想要添加新員工,則將其設置爲null – Boot750

+0

'SelectedEmployee'與添加新的'Employee'無關......要做到這一點,您只需要調用' Employees.Add(新員工())'。 – Sheridan

+0

用戶可以在該文本框中輸入數據並向Datagrid添加新的Employee。或者他選擇一個並更改現有數據。 – Boot750