WPF-DataGridComboBoxColumn第一行的不同ItemsSource



我有一个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筛选器,但似乎应用不正确。

正确的方法是什么?

如果将DataGridAlternationCount属性设置为int.MaxValue,并使用带有DataTriggerStyle绑定到父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.");
}
}

相关内容

  • 没有找到相关文章

最新更新