combined/Compound 属性 的 UWP C# 引发通知

UWP C# Raise Notification for a combined/Compound property

我有一个非常简单的复合 属性,我将 2 个字符串连接在一起形成只读的第三个 属性,这样我就可以将 1 个 属性 绑定到 xaml。

public string LocationCompleteString => $"{LocationName}/{SubLocationName}";

按预期工作,但问题是我还想在“LocationName”或“SubLocationName”更新时为 LocationCompleteString RaiseNotification,为此我尝试了以下操作:

public MyClass() => PropertyChanged += MyClass_PropertyChanged;
private void MyClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if(e.PropertyName == nameof(LocationName) || e.PropertyName == nameof(SubLocationName))
        {
            RaisePropertyChanged(LocationCompleteString);
        }
    }

但这不起作用,因为这不会更新 LocationCompleteString 的值,所以在发出通知之前我首先需要以某种方式更新它的值,我知道我可以创建一个私有方法这个 属性 的 returns 值,然后就在为它发出通知之前,我可以用那个方法再次更新它的值,但我想知道是否有更好、更通用的方法来实现它?也许我可以以某种方式调用“LocationCompleteString.Get()”方法,该方法将再次执行其 get 方法以更新值或类似的东西?

示例项目 : https://github.com/touseefbsb/CompoundNotify

谢谢。

看来你没有正确调用RaisePropertyChanged,请参考下面的代码。我已经测试过了,在我这边很好用。

public class MyClass : INotifyPropertyChanged
{
    public MyClass() => PropertyChanged += MyClass_PropertyChanged;

    public event PropertyChangedEventHandler PropertyChanged;

    private string _locationName;
    private string _subLocationName;
    private string _locationCompleteString;
    public string LocationName
    {
        get
        {
            return _locationName;
        }

        set
        {
            _locationName = value;
            RaisePropertyChanged( nameof(LocationName));
        }
    }
    public string SubLocationName
    {
        get
        {        
            return _subLocationName;
        }
        set
        {
            _subLocationName = value;
            RaisePropertyChanged(nameof(SubLocationName));
        }
    }
    public string LocationCompleteString => $"{LocationName}/{SubLocationName}";

    private void MyClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(LocationName) || e.PropertyName == nameof(SubLocationName))
        {
            RaisePropertyChanged(nameof(LocationCompleteString));
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Xaml

<StackPanel>
    <StackPanel.DataContext>
        <local:MyClass />
    </StackPanel.DataContext>
    <TextBlock x:Name="FullContent" Text="{Binding LocationCompleteString}" />
    <TextBox x:Name="Header" Text="{Binding LocationName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox x:Name="Footer" Text="{Binding SubLocationName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>