是否可以将元素绑定与 DataGridComboBoxColumns 选定项一起使用?
我有一些对象 MyObject,它包含 ObservableCollection 类型的属性“ListOfSomeTypes”。SomeType 实现 INotifyPropertyChanged。
SomeType 列表应显示在 DataGrid 中。对于“ListOfSomeTypes”,我正在寻找执行以下操作的解决方案:DataGrid 有两列。一种是具有固定整数列表的 DataGridComboBoxColumn,例如 {0,1,2,3}。该列的 ItemsSource 是通过 Binding 设置的(属性“ListOfIndices”,它不是 MyObject 的一部分)。第二列应在所选索引位置(来自另一列)显示“ListOfSomeTypes”的内容。所以我想我可以使用 MultiConverter 来检查两者的值并选择正确的值进行显示。问题是,尽管组合框显示了我的索引列表的第一项,但从未设置过应该作为索引的值(null)。
由于索引只需要显示,我不想在我的 MyObject 类中有一个“SelectedIndex”属性。是否可以通过元素绑定访问组合框的选定值?需要使用哪个属性(因为 SelectedValueBinding 似乎是错误的)?或者,还有更好的方法?
这是我的代码:
<DataGridCheckBoxColumn Header="SomeType">
<DataGridCheckBoxColumn.Binding>
<MultiBinding Converter="converters:SomeTypeCodeToBoolMultiConverter}">
<Binding Path="ListOfSomeTypes" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
<Binding ElementName="dgcbcSelectedIndex" Path="SelectedValueBinding"
UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</DataGridCheckBoxColumn.Binding>
</DataGridCheckBoxColumn>
<DataGridComboBoxColumn x:Name="dgcbcSelectedIndex" Header="Indices">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Data.ListOfIndices, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Data.ListOfIndices, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
转换器
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2)
return null;
var listOfSomeTypes= (ObservableCollection<SomeType>) values[0];
if (listOfSomeTypes!= null)
{
int selectedIndex = 0;
if (values[1] != null)
{
try { selectedIndex = (int)values[1]; }
catch (Exception) { }
}
if (listOfSomeTypes.Count > selectedIndex )
{
var someType= listOfSomeTypes[selectedIndex ];
return someType == TypeA;
}
}
return null;
}
谢谢你的帮助!