Связывание не вызывает действие <> - PullRequest
0 голосов
/ 23 октября 2011

У меня есть такой код это пользовательская сетка данных, которая отображает иерархические данные, которые должны закрываться и открываться.

<UserControl.DataContext>
    <loc:Def1 x:Name="initdef1"/>
</UserControl.DataContext>
 <Grid x:Name="LayoutRoot" HorizontalAlignment="Center" VerticalAlignment="Center" >
    <data:DataGrid x:Name="_dataGrid" AutoGenerateColumns="False" 
               ItemsSource="{Binding Display, Mode=OneWay}" 
                   SelectionMode="Extended" >
        <data:DataGrid.Columns>
            <data:DataGridTemplateColumn Header="Col1">
                <data:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" >
                            <CheckBox IsChecked="{Binding IsExpanded, Mode=TwoWay}" Margin="{Binding Path=Level, Converter={StaticResource ConvertToThickness}}"/>
                            <TextBlock Text="{Binding Cells[0]}" Margin="4" />
                        </StackPanel>
                    </DataTemplate>
                </data:DataGridTemplateColumn.CellTemplate>
            </data:DataGridTemplateColumn>
            <data:DataGridTextColumn Header="Col2" Binding="{Binding Cells[1]}" />
        </data:DataGrid.Columns>
    </data:DataGrid>

с этим является def1 этот класс имеет реальную логику для всей обработки, загрузки и отображения данных в сетку.

public Def1()
    {
        _columns = new List<ColumnDef>();
        _source = new ObservableCollection<Def2>();

        Def2.RowExpanding += new Action<Def2>(RowDef_RowExpanding);
        Def2.RowCollapsing += new Action<Def2>(RowDef_RowCollapsing);
    }
    void RowDef_RowExpanding(Def2 row)
    {
        foreach (RowDef child in row.Children)
            child.IsVisible = true;
        OnPropertyChanged("Display");
    }
    void RowDef_RowCollapsing(Def2 row)
    {
        foreach (Def2 child in row.Children)
        {
            if (row.IsExpanded.HasValue && row.IsExpanded.Value)
                RowDef_RowCollapsing(child);
            child.IsVisible = false;
        }
        OnPropertyChanged("Display");
    }

и это в def2 у этого класса есть логика поведения строк.

public bool? IsExpanded
    {
        get { return _isExpanded; }
        set 
        {
            if (_isExpanded != value)
            {
                _isExpanded = value;
                if (_isExpanded.Value)
                {
                    if (RowDef.RowExpanding != null)
                        RowDef.RowExpanding(this);
                }
                else
                {
                    if (RowDef.RowCollapsing != null)
                        RowDef.RowCollapsing(this);
                }
            }
        }
    }

Дело в том, что когда флажок установлен или снят, ничего не происходит.

1 Ответ

1 голос
/ 24 октября 2011

Хорошо. Я нашел ответ из аналогичного поста. Проблема двустороннего связывания столбца шаблона таблицы данных wpf 4.0

Итак, я изменил код на

<CheckBox IsChecked="{Binding Mode=TwoWay, Path=IsExpanded, UpdateSourceTrigger=PropertyChanged}" Margin="{Binding Path=Level, Converter={StaticResource ConvertToThickness}}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" x:Name="checkbox1"/>

Сейчасоно работает.Но кто-нибудь может объяснить, почему мне нужно было установить UpdateSourceTrigger = PropertyChanged?Это не всегда требуется.

Спасибо

...