Изменение источника элементов комбинированного списка данных на основе свойства с конвертером - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю DataGrid, который имеет DataGridTemplateColumn с пользовательским ComboBox.Я хочу изменить ItemSource этого ComboBox в соответствии со значением, выбранным в предыдущем столбце.Чтобы добиться этого, я использую IMultiValueConverter. Я заметил, что когда я изменяю ItemSource второй строки, выбранное значение в первой строке становится пустым, когда выбранный элемент больше не доступен в этом 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>

My 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, поэтому первая строка немедленно реагирует на это, ничего не отображая в столбце использования Здесьтакое изображение того, как выглядит моя DataGrid

Итак, как мне сделать XAML, чтобы мой ItemSource был независимым для каждой строки?

...