如何将模板列可见性绑定到WPF DataGrid中其他列的selectedValue

时间:2015-03-11 09:06:55

标签: c# wpf xaml binding datagrid

我的数据网格有点问题。我在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");
        }
    }

感谢您的帮助!

0 个答案:

没有答案