Привязка DataTrigger не отвечает на обновление свойства в ObservableDictionary - PullRequest
0 голосов
/ 26 августа 2018

У меня есть следующий 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 всегда равно нулю?

Любая помощь приветствуется !!

...