【问题标题】:WPF - Different ItemsSource for first row of DataGridComboBoxColumnWPF - DataGridComboBoxColumn 第一行的不同 ItemsSource
【发布时间】:2021-12-14 17:10:31
【问题描述】:

我有一个包含多个列的 DataGrid,包括 DataGridComboBoxColumn。

我希望 ComboBox 只为第一行提供有限的选择。

<DataGridComboBoxColumn x:Name="myDataGrid"
                                    SelectedItemBinding="{Binding Direction,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
                                    ItemsSource="{Binding Source={StaticResource DirectionTypesCVS}}"
                                    Header="Direction" 
                                    Width="*"/>

My DirectionTypeCVS 是一个 CollectionViewSource,它返回一个 DirectionType 枚举列表,“NORTH、EAST、SOUTH、WEST”。对于第一行,我想将其限制为“NORTH”和“SOUTH”。

我已经尝试在代码隐藏中更改 ItemsSource,但这并不正确。我还尝试添加一个 CollectionViewSource 过滤器,但它似乎没有被正确应用。

什么是正确的方法?

【问题讨论】:

    标签: wpf xaml combobox


    【解决方案1】:

    如果您将DataGridAlternationCount 属性设置为int.MaxValue 并使用Style 和绑定到DataTriggerDataTrigger,则可以避免使用转换器。家长DataGridRow:

    <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>
            ...
    

    【讨论】:

      【解决方案2】:

      我建议您使用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.");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        相关资源
        最近更新 更多