2013-12-19 50 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;