Связывание не обновляется, хотя событие PropertyChanged вызвано - PullRequest
0 голосов
/ 24 января 2020

Context

У меня есть собственный контроллер, который содержит 2 флажка, когда вы нажимаете на непроверенный, он проверяет его и снимает флажок с другого.

Этот механизм проверки / снятия флажка c реализовано в методах получения и установки двух связанных свойств. Установщики этих двух свойств вызывают метод NotifyPropertyChanged().

В коде моих контроллеров я зарегистрировался на событие PropertyChanged с функцией, которая просто отображает имя свойства для тестирования цель. У меня также есть печать в обоих получателях моих связанных свойств для целей тестирования.

Всякий раз, когда элемент управления загружается, он проверяет правильный CheckBox (независимо от того, является ли он левым или правым), поэтому я уверен, что привязка работает .

Проблема

Что меня смущает, так это то, что когда я нажимаю на непроверенный CheckBox, мой обработчик событий отладки срабатывает дважды, говоря, что оба Property1 и Property2 изменились, но отпечаток в моих методах получения (который я ожидаю, будет вызван дважды, так как событие PropertyChanged было вызвано дважды) отображаются только для 1 из 2 свойств.

Ресурсы

Вот как выглядят мои Свойства:

[XmlIgnore]
public bool IsLongRanged
{
    get
    {
        Console.WriteLine("in get long");
        return Range == AttackRangeEnum.LongRange;
    }
    set
    {
        Console.WriteLine("in set long" + value);
        if (value == true)
        {
            Console.WriteLine("setting range to long");
            Range = AttackRangeEnum.LongRange;
            IsCloseRanged = false;
        }
        NotifyPropertyChanged();
    }
}

[XmlIgnore]
public bool IsCloseRanged
{
    get
    {
        Console.WriteLine("in get close");
        return Range == AttackRangeEnum.CloseRange;
    }
    set 
    {
        Console.WriteLine("in set close" + value);
        if (value == true)
        {
            Console.WriteLine("setting range to close");
            Range = AttackRangeEnum.CloseRange;
            IsLongRanged = false;
        }
        NotifyPropertyChanged();
    }
}

Вот мой пользовательский Контроллер:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <TextBlock 
        Grid.Column="0"
        Text="close: "/>
    <CheckBox 
        Grid.Column="1"
        x:Name="CloseRangedCheckBoxControl"
        IsChecked="{Binding IsCloseRanged}"/>
    <TextBlock 
        Grid.Column="2"
        Text="range: "/>
    <CheckBox 
        x:Name="LongRangedCheckBoxControl"
        Grid.Column="3"
        IsChecked="{Binding IsLongRanged}"/>
    <Button 
        Grid.Column="4"  
        Content="Test" 
        Click="Button_Click"/>
</Grid>

Вот как я регистрируюсь на событие PropertyChanged:

public EditableRangeController()
{
    InitializeComponent();
    Loaded += EditableRangeController_Loaded;
}

private void EditableRangeController_Loaded(object sender, RoutedEventArgs e)
{
    AAttackTemplate tmp = DataContext as AAttackTemplate;
    tmp.PropertyChanged += Tmp_PropertyChanged;
}

private void Tmp_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    Console.WriteLine("a property changed: " + e.PropertyName);
}

И, наконец, вывод моей консоли всякий раз, когда я отмечаю не отмеченный флажок:

in set closeTrue
setting range to close
a property changed: Range
in set longFalse
a property changed: IsLongRanged
a property changed: IsCloseRanged
in get close

, поскольку вы можете видеть, как событие PropertyChanged было выброшено для обоих моих свойств, но только 1 получает был вызван впоследствии: /

...