2013-12-19 81 views
3

如何在wpf數據網格中綁定(Itemssource和選定的項目)組合框?我正在使用MVVM模式。 我試圖如何綁定wpf數據網格中的組合框?

<DataGridTemplateColumn Header="Example 9"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox ItemsSource="{Binding PartIds, RelativeSource={RelativeSource AncestorType=Window}}" SelectedItem="{Binding PartId, UpdateSourceTrigger=PropertyChanged}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 

用於數據綁定

#region DataGrid List<String> Example 

     public ObservableCollection<MyCar> MyCars { get; set; } 
     public List<string> PartIds { get; set; } 

     #endregion 

     #region DataGrid List<Class> Example 

     public List<CarPart> CarParts { get; set; } 

     #endregion 

參考

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MyCars}" HorizontalAlignment="Left"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Model" Binding="{Binding Model}"/> 
        <DataGridTextColumn Header="Registration" Binding="{Binding Registration}"/> 

        <DataGridTemplateColumn Header="Example 12"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox ItemsSource="{Binding CarParts, RelativeSource={RelativeSource AncestorType=Window}}" DisplayMemberPath="PartName" SelectedValuePath="PartID" SelectedValue="{Binding PartId, UpdateSourceTrigger=PropertyChanged}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 

        <DataGridTextColumn Header="Selected" Binding="{Binding PartId}"/> 

       </DataGrid.Columns> 
      </DataGrid> 

屬性: http://code.msdn.microsoft.com/windowsdesktop/Best-ComboBox-Tutorial-5cc27f82

+0

你如何設置窗口控件的DataContext? –

+0

在代碼文件中。 – user2330678

+0

公共部分類MainWindow:Window { MainWindowViewModel vm = new MainWindowViewModel(); () public MainWindow() this.DataContext = vm; InitializeComponent(); }} – user2330678

回答

1

嘗試使你的清單可觀察集合。您需要確保您的屬性在將新對象添加到您的收藏集時告訴您的用戶界面,這就是ObservableCollection爲您所做的。

還要確保您的CarPartMyCar類實施INotifyPropertyChanged

這是否是您的問題取決於您的屬性何時設置。

1

只是一個猜測,因爲我不是在我的dev站,但嘗試使用的ElementName通過名稱引用,而不是相對源窗口...

喜歡的東西:

ItemsSource="{Binding CarParts,ElementName=MyWindowName}" 

和附加一個名稱=「MyWindowName」給窗口定義。

6

我已經嘗試了很多選項,但我發現的最簡單的選項是生成該組合框的加載事件&將它與列表或數據表綁定。

例如 在XAML

<DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
        <ComboBox x:Name="cmbPayee" Loaded="cmbPayee_Loaded" Text="{Binding PayeeName, NotifyOnSourceUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue ="{Binding PayeeID, NotifyOnSourceUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath = "Payee1" SelectedValuePath="PayeeID"/> 
     </DataTemplate> 

在的.cs代碼

private void cmbPayee_Loaded(object sender, RoutedEventArgs e) 
    { 
     ComboBox cmb = (ComboBox)sender; 
      var res = from k in db.Payees 
         select k; 
      cmb.ItemsSource = res.ToList(); 
      cmb.DisplayMemberPath = "Payee1"; 
      cmb.SelectedValuePath = "PayeeID"; 

    } 
0

只是使用此OS的.cs側

的DataContext = CarParts;