如何在wpf datagrid中绑定组合框(Itemssource和所选项目)?我正在使用MVVM模式。 我试过了
<DataGridTemplateColumn Header="Example 9">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding PartIds, RelativeSource={RelativeSource AncestorType=Window}}" SelectedItem="{Binding PartId, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
和
<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>
用于数据绑定的属性
#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
参考: http://code.msdn.microsoft.com/windowsdesktop/Best-ComboBox-Tutorial-5cc27f82
答案 0 :(得分:6)
我尝试了很多选项,但我找到的最简单的选项是生成该组合框的加载事件&amp;将它与列表或数据表绑定。
e.g。 在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";
}
答案 1 :(得分:1)
尝试制作列表可观察的集合。您需要确保在将新对象添加到您的收藏集时,您的属性会告诉您的用户界面,这是ObservableCollection
为您所做的事情。
另外,请确保您的CarPart
和MyCar
班级实施INotifyPropertyChanged
。
这是否是您的问题取决于何时设置了您的属性。
答案 2 :(得分:1)
因为我不在我的开发站,只是猜测,但尝试使用ElementName按名称而不是相对来源引用窗口...
类似的东西:
ItemsSource="{Binding CarParts,ElementName=MyWindowName}"
并在窗口定义中添加Name =“MyWindowName”。
答案 3 :(得分:0)
只需使用此操作系统.cs端
DataContext = CarParts;