我的数据网格有点问题。我在stackoverflow上搜索,但找不到可以解决我案例的答案。
我有一个带有DataGrid的窗口。窗口datacontext绑定到ViewModel。 在我的datagrid上,我有mutliple列,但现在,重要的是,有三列: 第一个是datatemplate列,其中包含带有多个条目的ComboBox,第二个是带有TextBox的datatemplate列,第三个是带有另一个组合框的datatatemplate列。
根据第一列ComboBox中的选择,我想隐藏/显示第二列和第三列,具体取决于类型(它们不能同时显示)。
所以我在ViewModel中创建了一个属性
public Visibility MetierListVisibility
{
get
{
return _metierListVisibility;
}
set
{
_metierListVisibility = value;
RaisePropertyChanged();
}
}
我将此属性绑定到XAML中的DataColumn:
<DataGridTemplateColumn Header="Valeur" Width="2*" x:Name="cln_value"
Visibility="{Binding Data.MetierListVisibility, Source={StaticResource proxy}, Converter={StaticResource InverseVisibilityConverter}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value, ValidatesOnDataErrors=True}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid>
<TextBox Text="{Binding Value, ValidatesOnDataErrors=True}" Initialized="TextBox_Initialized" x:Name="tb_content" MouseLeftButtonUp="tb_content_MouseDown" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Valeur" Width="2*" x:Name="cln_value_metier"
Visibility="{Binding Data.MetierListVisibility, Source={StaticResource proxy}}" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value, ValidatesOnDataErrors=True, Converter={StaticResource MetierConvertor}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Metiers}"
DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Value}" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
这是我的第一栏的XAML:
<DataGridTemplateColumn Header="Champ" x:Name="LineField" Width="1.5*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Field , ValidatesOnDataErrors=True}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="cb_Fields" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ListFields}"
SelectedItem="{Binding Field}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
我不知道在第一列更改时如何继续刷新我的列? 我的第一列中选择的数据存在于我的数据源中,所以我试试这个:
private void cb_Fields_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
(gd_filterCriterion as DataGrid).GetBindingExpression(DataGrid.SelectedItemProperty).UpdateSource();
}
因为在我的网格上,SelectedItem与此链接:
public Criterion SelectedCriterion
{
get
{
return _selectedCriterion;
}
set
{
_selectedCriterion = value;
MetierListVisibility = (value != null && value.Field == "Métier" ? Visibility.Visible : Visibility.Hidden);
RaisePropertyChanged();
RaisePropertyChanged("MetierListVisibility");
}
}
感谢您的帮助!