У меня есть следующий ObservableDictionary, определенный в code-behind (это не приложение MVVM :-( и я его не писал).
Класс code-behind представления устанавливает DataContext в конструкторев DataContext = this.
public ObservableDictionary<string, PhaseGroupBoxWrapper> PhasesGridDictionary { get; set; } = new ObservableDictionary<string, PhaseGroupBoxWrapper>();
PhaseGroupBoxWrapper определяется следующим образом:
public class PhaseGroupBoxWrapper : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private bool _isHidden;
public bool IsHidden
{
get { return _isHidden; }
set
{
_isHidden = value;
OnPropertyChanged("IsHidden");
}
}
}
У меня есть кнопка, которая является частью контекстного меню левого щелчка и определяется в представлении какСледующее: Обратите внимание, что в разделе Стиль у меня есть содержимое Button, сгенерированное DataTrigger и конвертером.
<Button
Tag="ToggleVisButton"
Margin="2"
Command="{Binding GroupBoxTogglePhaseVisibility}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource PhaseEditMultiParamConverter}">
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Tag"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Header"/>
</MultiBinding>
</Button.CommandParameter>
<Button.Style>
<Style TargetType="Button">
<Setter Property="Content" Value="Show Phase"/>
<Style.Triggers>
<DataTrigger Value="False">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource PhaseHideShowButtonContentConverter}">
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Tag"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Header"/>
<Binding Path="PhasesGridDictionary"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Content" Value="Hide Phase"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
.... и конвертер определен как:
public class PhaseHideShowButtonContentConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
bool retVal = false;
if ((string)values[0] != String.Empty)
{
string[] calibrationInfo = ((string)values[0]).Split(' ');
string controllerName = calibrationInfo[0];
string calibrationName = calibrationInfo[2];
string phaseName = (string)values[1];
ObservableDictionary<string, PhaseGroupBoxWrapper> PhasesGridDictionary = (ObservableDictionary<string, PhaseGroupBoxWrapper>)values[2];
string dictionaryKey = controllerName + " - " + calibrationName + " - " + phaseName;
retVal = PhasesGridDictionary[dictionaryKey].IsHidden;
}
return retVal;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что при запуске содержимое кнопки устанавливается правильно.Если свойству PhaseGroupBoxWrapper IsHidden впоследствии присваивается другое значение, вызывается установщик, но в функции OnPropertyChanged значение PropertyChanged всегда равен нулю , что приводит к тому, что Button DataTrigger не запускается.
Может кто-нибудь объяснить, почему PropertyChangeЗначение d всегда равно нулю?
Любая помощь приветствуется !!