Флажок WPF двухсторонняя привязка от свойства к пользовательскому интерфейсу не работает в событии propertychanged

Я использую двустороннюю привязку в столбце данных флажка в элементе управления представлением Telerik Grid. когда я меняю состояние флажка в пользовательском интерфейсе, он работает нормально, вызывая событие изменения свойства. Но я также хочу наоборот: при изменении значения свойства в коде позади состояние флажка также должно обновляться в пользовательском интерфейсе.

<Button x:Name="btn1" Grid.Row="0" Content="Refresh" Click="btn1_Click" Width="100" Margin="0,5"/>
    <telerik:RadGridView Grid.Row="1"  x:Name="gridView" ShowGroupPanel="False" IsFilteringAllowed="False" SelectionMode="Multiple">
        <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn Width="70" Header="Color">
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox  IsChecked="{Binding ChangeValue, Mode=TwoWay}" Margin="3"/>
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
            <telerik:GridViewDataColumn Header="Data" DataMemberBinding="{Binding dataVal}" IsReadOnly="True"/>
        </telerik:RadGridView.Columns>
    </telerik:RadGridView>
</Grid>

Код ниже

public partial class MainWindow : Window
{
    List<Data> dataSource = new List<Data>();
    public MainWindow()
    {
        InitializeComponent();            
        for (int i = 0; i < 10; i++)
        {
            data d = new Data();
            d.DataVal= "Data " + (i + 1);
            dataSource.Add(d);
        }
        this.gridView.SelectedItems.Clear();
        PopulateGridView();
    }
    private void PopulateGridView()
    {
        foreach (Data d in dataSource)
        {
            d.DataVal= false;
        }

        this.gridView.ItemsSource = dataSource;
        List<Data> selectedItems = new List<Data>();
        selectedItems.Add(dataSource[0]);
        this.gridView.Select(selectedItems);
    }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        PopulateGridView();
    }

}

public class Data: INotifyPropertyChanged
{
    public Data()
    {
        DataVal = string.Empty;
    }
    public string DataVal { get; set; }

    public bool ChangeValue
    {
        get { return changevalue; }
        set
        {
            if (value != changevalue)
            {
                changevalue= value;
                if (ApplyPropertyChanged!= null)
                {
                    ApplyPropertyChanged(this, new PropertyChangedEventArgs("ChangeValue"));
                }
            }
        }
    }

    private bool changevalue;
    public event PropertyChangedEventHandler ApplyPropertyChanged;

}

При нажатии кнопки «Обновить» я хочу, чтобы все флажки были сняты, но они не обновляются, когда я устанавливаю для ChangeValue значение false в PopulateGridView. Пожалуйста, подскажите, как я могу этого добиться.


person CodingAgent    schedule 16.03.2015    source источник
comment
Как вы можете установить DataVal на false?   -  person Default    schedule 17.03.2015
comment
Я считаю, что мероприятие следует называть PropertyChanged, а не ApplyPropertyChanged. Это вообще компилируется?   -  person Default    schedule 17.03.2015


Ответы (1)


Вам нужно указать, когда пользовательский интерфейс должен быть обновлен, в этом случае onpropertychanged

       <CheckBox  IsChecked="{Binding ChangeValue, Mode=TwoWay, UpdateSourceTrigger="PropertyChanged"}" Margin="3"/>
person andrea    schedule 16.03.2015
comment
Спасибо за ответ, но он все еще работает с UpdateSourceTrigger. - person CodingAgent; 17.03.2015
comment
обработчик события изменения свойства ведет себя очень странно. если я изменю имя обработчика с ApplyPropertyChanged на PropertyChanged, тогда он будет работать должным образом даже без использования UpdateSourceTrigger. Кто-нибудь знает, почему имя обработчика событий может повлиять на двустороннюю привязку? - person CodingAgent; 17.03.2015