我需要在我的dataGrid中使用DataGridComboboxColumn
。
但是我要绑定到我的数据网格的可观察集合不是静态的吗?
由于数据网格包含DataGridComboboxColumn
,因此Observale集合必须是静态的。
我要绑定到DataGridCombobox
列的是另一个集合,该类包含在我上面提到的可观察集合中的对象中。这是我第一次使用DataGridCombobox列。任何解释都将非常感激。
<DataGrid ItemSource="{Binding SomeData}">
<DataGrid.Columns>
<DataGridTemplateColumn DisplayMemberPath="FirstName" />
<DataGridTemplateColumn DisplayMemberPath="LastName" />
<DataGridComboboxColumn ItemSource={Binding SomeOtherListContainedInSomeDataAbove}" />
</DataGrid.Columns>
<DataGrid>
但这会产生绑定错误,并且无法找到 SomeOtherListContainedInSomeDataAbove 。
请帮助。
答案 0 :(得分:1)
DataGridComboboxColumn
不参与逻辑树,因此很难直接为其ItemsSource
进行绑定。但DataGridCell
是逻辑树的一部分。您可以创建元素样式并尝试绑定您的集合。在下面的示例中,我使用DataGridComboBoxColumn
和DatagridTemplateColumn
给出了两种方法。我假设您正在使用MVVM。
<DataGrid ItemsSource="{Binding DataGrdList}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn SelectedItemBinding="{Binding DataTypeName}" Header="Combo">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.DataTypeList}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.DataTypeList}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTemplateColumn Header="Template">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=DataTypeName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.DataTypeList}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataTypeName, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
}
public class MainViewModel
{
private ObservableCollection<string> myVar = new ObservableCollection<string>();
public ObservableCollection<string> DataTypeList
{
get { return myVar; }
set { myVar = value; }
}
private ObservableCollection<DataType1> myVar1 = new ObservableCollection<DataType1>();
public ObservableCollection<DataType1> DataGrdList
{
get { return myVar1; }
set { myVar1 = value; }
}
public MainViewModel()
{
myVar.Add("Int");
myVar.Add("Bool");
myVar.Add("String");
}
}
public class DataType1
{
private string name;
public string DataTypeName
{
get { return name; }
set { name = value; }
}
}
答案 1 :(得分:0)
你试过了吗?
<DataGridComboboxColumn ItemSource={Binding path=SomeOtherListContainedInSomeDataAbove}">
如果绑定的上下文是SomeData
,则应将其指向正确的属性)
来自MSDN:
要填充下拉列表,请先为其设置ItemsSource属性 ComboBox使用以下选项之一:
静态资源。有关更多信息,请参阅StaticResource Markup 扩展
一个x:静态代码实体。有关更多信息,请参阅x:静态标记扩展。
ComboBoxItem类型的内联集合。
设置ItemsSource后,将ComboBox中的选定项绑定到单元所在行的数据项。您可以使用以下属性之一设置绑定....
所以,如果它不是静态的,我会说尝试选项3:)