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>
我有一个非常简单的复合 属性,我将 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>