我正在创建一个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?