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 получает был вызван впоследствии: /