我想知道如何在不直接使用 Content
属性的情况下更新控件的值。特别是我有这种情况,这是我的控制:
<Label x:Name="Test" Content="{Binding Tester, IsAsync=True}" />
现在,在我的ViewModel
中,我有一个名为 Tester 的属性,它具有以下结构:
public string Tester
{
get { return DateTime.Now.ToString(); }
}
这很好用,但为了将值分配给测试Label
我通常在我的MainWindow
中这样做:
Test.Content = ViewModel.Tester;
是否可以直接调用ViewModel.Tester
并自动更新测试Label
值?
在 ViewModel 类中,您必须实现 INotifyPropertyChanged
接口,修改内容后,可以通过引发事件来手动通知 UI:
Test.Content = ViewModel.Tester;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Test.Content))); // or throw it on the long (old) way
编辑:
由于它已经绑定到测试器,我建议以这种方式使用它:
string _testString;
public string TestString
{
get { return _testString; }
set
{
_testString = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TestString)));
}
}
在 xaml 中,我将绑定 TestString
属性:
<Label Content="{Binding TestString}" />
因此,当您在某处设置 TestString
属性时,Label's
Content
会自动更新。
例如,如果您想将其设置为TextBox
以进行测试:
<TextBox Text="{Binding TestString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
注意:此解决方案的要求是使用 ViewModel 类实现INotifyPropertyChanged
接口,并将其设置为视图的DataContext
。
可以使用此方法触发PropertyChanged
事件:
protected void OnPropertyChanged(object sender, string propertyName = "")
{
PropertyChanged?.Invoke(sender, new PropertyChangedEventArgs(propertyName));
}
您不应该将其用作 internal
/public
,因为它会损害关注点的分离。所有者类(或继承的类)应处理通知过程。