我有一个DataGrid,它有几个列,包括一个DataGridComboBoxColumn。
我希望组合框只为第一行提供有限的选择。
<DataGridComboBoxColumn x:Name="myDataGrid"
SelectedItemBinding="{Binding Direction,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Source={StaticResource DirectionTypesCVS}}"
Header="Direction"
Width="*"/>
My DirectionTypeCVS是返回DirectionType枚举列表的CollectionViewSource;"北、东、南、西";。对于第一行,我想将其限制为";"北";以及";南方";。
我已经尝试更改代码后面的ItemsSource,但这不正确。我还尝试添加了一个CollectionViewSource筛选器,但似乎应用不正确。
正确的方法是什么?
如果将DataGrid
的AlternationCount
属性设置为int.MaxValue
,并使用带有DataTrigger
的Style
绑定到父DataGridRow
:的ItemsControl.AlternationIndex
附加属性,则可以不使用转换器
<DataGrid ... AlternationCount="2147483647">
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name="myDataGrid"
SelectedItemBinding="{Binding Direction,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Header="Direction"
Width="*">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Style.Triggers>
<DataTrigger Binding="{Binding (ItemsControl.AlternationIndex),
RelativeSource={RelativeSource AncestorType=DataGridRow}}"
Value="0">
<Setter Property="ItemsSource" Value="{Binding Source={StaticResource DirectionTypesCVSSpecial}}"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="ItemsSource" Value="{Binding Source={StaticResource DirectionTypesCVS}}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
...
我建议您使用DataGridTemplateColumn
而不是DataGridComboBoxColumn
,这样您就可以绑定该行并找到AlternationIndex
。您需要做的是编写一个转换器。
<DataGrid ItemsSource="..." AutoGenerateColumns="False" AlternationCount="2147483647">
<DataGrid.Columns>
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Direction, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource multivalcnv}">
<Binding Source="{StaticResource yourStr}"/>
<Binding Path="AlternationIndex" RelativeSource="{RelativeSource AncestorType=DataGridRow}"/>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
public class MultValConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if(values != null && values.Length == 2 && values[1] is int)
if((int)(values[1]) == 0)
{
return new List<string> { "Do filter the values[0]" };
}
else
return values[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException("It's a one way converter.");
}
}