Я создаю 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 был независимым для каждой строки?