DataGrid TemplateClumn ComboBox ItemsSource 和 SelectedValue
DataGrid TemplateClumn ComboBox ItemsSource and SelectedValue
您好,我有一个包含两列的数据网格。如下所示:
<DataGrid ItemsSource="{Binding MyCollection}">
<DataGrid.Columns>
<DataGridTextColumn Width="85*" Header="Team Name" Binding="{Binding TeamName}"/>
<DataGridTemplateColumn Header="Prefix">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}"
SelectedValue="{Binding Prefix}">
//SelectedValue="{Binding Prefix}" - this is not working i also tried SelectedItem
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
就像你可以看到我有一个带有 ComboBox 的 DataGridTemplateColumn。我已将 ComboBox ItemsSource 绑定到一个包含一些固定值的集合。现在我想将 ComboBox 的 SelectedValue 绑定到 MyClass 的前缀 属性(这是我的 DataGrid 的 DataContext)。但是由于我将此 ComboBox 的 ItemsSource 设置为其他 Collection 此绑定不起作用我认为 datacontext 已更改。
下面是一个 class,它是数据网格的数据上下文:
public class MyClass
{
public string TeamName{get;set;}
public string Prefix{get;set;}
}
// DataGrid.DataContext is ObservableCollection<MyClass>
因此,AllowedPrefixes 集合在 ComboBox 中正确显示,但 Prefix 属性未更新。我应该如何正确地进行此 SelectedValue 绑定?
编辑。
请注意 ComboBox ItemsSource 与我想用 SelectedValue 更新的集合不同
编辑。
我认为它不起作用,因为我将 ComboBox ItemsSource 设置为不同的集合。我试过如下但没有成功:
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}"
SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=DataContext.Prefix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
为您的 ComboBox
尝试以下操作:
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}"
SelectedValue="{Binding DataContext.Prefix, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, UpdateSourceTrigger=PropertyChanged}">
如果您的 DataGrid
在 UserControl
而不是 Windows
中,请将 AncestorType 更改为 UserControl
好吧,尽管你 - 不知道答案的人在没有解释的情况下给我投了反对票。我找到了解决方案。我将它发布在下面,将来有人可能会使用它,我必须将 NotifyOnTargetUpdated 设置为 true:
<ComboBox
SelectedItem="{Binding Prefix, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}">
您好,我有一个包含两列的数据网格。如下所示:
<DataGrid ItemsSource="{Binding MyCollection}">
<DataGrid.Columns>
<DataGridTextColumn Width="85*" Header="Team Name" Binding="{Binding TeamName}"/>
<DataGridTemplateColumn Header="Prefix">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}"
SelectedValue="{Binding Prefix}">
//SelectedValue="{Binding Prefix}" - this is not working i also tried SelectedItem
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
就像你可以看到我有一个带有 ComboBox 的 DataGridTemplateColumn。我已将 ComboBox ItemsSource 绑定到一个包含一些固定值的集合。现在我想将 ComboBox 的 SelectedValue 绑定到 MyClass 的前缀 属性(这是我的 DataGrid 的 DataContext)。但是由于我将此 ComboBox 的 ItemsSource 设置为其他 Collection 此绑定不起作用我认为 datacontext 已更改。 下面是一个 class,它是数据网格的数据上下文:
public class MyClass
{
public string TeamName{get;set;}
public string Prefix{get;set;}
}
// DataGrid.DataContext is ObservableCollection<MyClass>
因此,AllowedPrefixes 集合在 ComboBox 中正确显示,但 Prefix 属性未更新。我应该如何正确地进行此 SelectedValue 绑定?
编辑。
请注意 ComboBox ItemsSource 与我想用 SelectedValue 更新的集合不同
编辑。
我认为它不起作用,因为我将 ComboBox ItemsSource 设置为不同的集合。我试过如下但没有成功:
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}"
SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=DataContext.Prefix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
为您的 ComboBox
尝试以下操作:
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}"
SelectedValue="{Binding DataContext.Prefix, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, UpdateSourceTrigger=PropertyChanged}">
如果您的 DataGrid
在 UserControl
而不是 Windows
中,请将 AncestorType 更改为 UserControl
好吧,尽管你 - 不知道答案的人在没有解释的情况下给我投了反对票。我找到了解决方案。我将它发布在下面,将来有人可能会使用它,我必须将 NotifyOnTargetUpdated 设置为 true:
<ComboBox
SelectedItem="{Binding Prefix, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.AllowedPrefixes}">