NotifyPropertyChanged не обновляет DependencyProperty в CustomControl - PullRequest
0 голосов
/ 17 апреля 2019

Я сделал CustomControl, с DP Threshold, вот так:

public class SymbolControl : Control
{
    public static readonly DependencyProperty ThresholdProperty = DependencyProperty.Register("Threshold", typeof(IThreshold<SolidColorBrush>), typeof(SymbolControl));

    public IThreshold<SolidColorBrush> Threshold
    {
        get { return (IThreshold<SolidColorBrush>)GetValue(ThresholdProperty); }
        set { SetValue(ThresholdProperty, value);  }
    }
...
}

Вот где свойство используется в xaml пользовательского элемента управления:

...
        <Border.Background>
            <MultiBinding Converter="{StaticResource ThreshholdToReturnValueConverter}" NotifyOnTargetUpdated="True" >
                <Binding Path="Threshold" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
                <Binding Path="SymbolValue" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
                <Binding Path="DefaultBackground" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
            </MultiBinding>
        </Border.Background>
...

А вот как используется CustomControl:

<controls:SymbolControl ... Threshold="{Binding Threshold, NotifyOnTargetUpdated=True, Converter={StaticResource DummyConverter}}" .../>

Когда я звоню NotifyPropertyChanged(nameof(Threshold)), CustomControl не обновляется.

Однако я поместил фиктивный преобразователь с точкой останова в привязку Threshold при создании экземпляра пользовательского элемента управления, и эта точка останова срабатывает, когда я вызываю NotifyPropertyChanged(nameof(Threshold)), поэтому кажется, что привязка не обновляет цель?

Я также попытался добавить PropertyChangedCallback для DP ThresholdProperty с точкой останова, в которой срабатывает только при первоначальном создании исходного свойства.

Я также обнаружил, что выполнение этого во ViewModel приводит к обновлению пользовательского элемента управления:

var temp = Threshold;
Threshold = null;
Threshold = temp;

Я много занимался поиском в Интернете, и мне не повезло, есть идеи, в чем проблема?

1 Ответ

0 голосов
/ 17 апреля 2019

Я нашел другую работу, так как я не смог использовать другую работу, представленную в вопросе:

Я добавил код в Threshold.cs:

public Threshold : IThreshold<SolidColorBrush>, INotifyPropertyChanged
{
...
    public Threshold()
    {
        ...
        this.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) { if (e.PropertyName != nameof(WorkAround)) { NotifyPropertyChanged(nameof(WorkAround)); } };
    }
...
public bool WorkAround { set; get; }
}

В xaml пользовательского элемента управления Я добавил 4-ую привязку к MultiBinding:

...
        <Border.Background>
            <MultiBinding Converter="{StaticResource ThreshholdToReturnValueConverter}" NotifyOnTargetUpdated="True" >
                <Binding Path="Threshold" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
                <Binding Path="SymbolValue" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
                <Binding Path="DefaultBackground" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
                <Binding Path="Threshold.WorkAround" RelativeSource="{RelativeSource TemplatedParent}" NotifyOnTargetUpdated="True" />
            </MultiBinding>
        </Border.Background>
...

Однако этот обходной путь не идеален, поэтому я не приму его, если кто-то найдет лучшее решение, пожалуйста, дайте мне знать:)

...