使用绑定执行控件更新,无需调用 .内容



我想知道如何在不直接使用 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 ,因为它会损害关注点的分离。所有者类(或继承的类)应处理通知过程。

最新更新