使用转换器根据属性更改datagrid组合框项源

时间:2018-11-20 15:17:59

标签: c# wpf ivalueconverter datagridtemplatecolumn imultivalueconverter

我正在创建一个DataGrid,它具有一个带有自定义ComboBox的DataGridTemplateColumn。我想根据上一列中选择的值更改此ComboBox的ItemSource。为此,我使用了IMultiValueConverter,我注意到当更改第二行的ItemSource时,当第一行中的选定值不再可用时,第一行的选定值将设置为空白。代码下方是一幅图片,用于更清晰的说明

在xaml中

<shell:ShellDataGrid x:Name="parameterDataGrid" ItemsSource="{Binding SelectedMethod.Parameters}" AutoGenerateColumns="false" CanUserAddRows="false" 
                    IsSynchronizedWithCurrentItem="True" HeadersVisibility="Column" SelectionMode="Single" SelectionUnit="FullRow">
    <shell:ShellDataGrid.Columns>
        <shell:DataGridTemplateColumn Header="DataType" IsReadOnly="False">
            <shell:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <shell:ShellComboBox ItemsSource="{Binding  ElementName=parameterDataGrid, Path=DataContext.DataTypes}"
                                         SelectedItem="{Binding DataType, UpdateSourceTrigger=PropertyChanged}" >
                    </shell:ShellComboBox>
                </DataTemplate>
            </shell:DataGridTemplateColumn.CellTemplate>
        </shell:DataGridTemplateColumn>
        <shell:DataGridTemplateColumn Header="Usage" IsReadOnly="False">
            <shell:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <shell:ShellComboBox
                                 SelectedItem="{Binding Usage, UpdateSourceTrigger=PropertyChanged}" >
                        <shell:ShellComboBox.ItemsSource>
                            <MultiBinding Converter="{StaticResource ParameterUsageConverter}">
                                <MultiBinding.Bindings>
                                    <Binding ElementName="parameterDataGrid" Path="DataContext.TerminalUsageEnumList"/>
                                    <Binding ElementName="parameterDataGrid" Path="SelectedItem"/>
                                </MultiBinding.Bindings>
                            </MultiBinding>
                        </shell:ShellComboBox.ItemsSource>
                    </shell:ShellComboBox>
                </DataTemplate>
            </shell:DataGridTemplateColumn.CellTemplate>
        </shell:DataGridTemplateColumn>
        <shell:DataGridDeleteColumn/>
    </shell:ShellDataGrid.Columns>
</shell:ShellDataGrid>

我的ParameterUsageConverter

public class ParameterUsageConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var usages = (values[0] as ObservableCollection<ParameterCallUsage>).ToObservableCollection();
        var methodParameter = values[1] as ParameterPlaceHolder;

        if (!methodParameter.DataType.IsClassOrInterface())
            usages.Remove(ParameterCallUsage.DynamicDispatch);

        return usages;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

如图所示,上方的DataGrid显示了DynamicDispatch仍在ItemSource列表中,在下方的中,选择了一个数据类型不是类的行,因此DynamicDispatch项从ItemSource中删除,因此第一行通过在“使用情况”列中不显示任何内容来立即对此做出响应 Here is the image of how my DataGrid looks

那么,如何使ItemSource独立于每行的XAML?

0 个答案:

没有答案