【问题标题】:Data binding in wpf with expression in getterwpf中的数据绑定与getter中的表达式
【发布时间】:2018-12-06 08:35:28
【问题描述】:

我的模型中有一个具有 getter 的属性

public boolean Status {
    get {
        return 1==2;
    }
}

还有一个标签

<Label Content="{Binding Path=Status, Mode=OneWay}" />

我想监控状态。现在,当 Status 值更改时,UI 不会使用该值更新。

【问题讨论】:

  • 给它一个私人集?另外,1==2 总是会返回 false,你如何设置值?
  • 1==2 只是一个例子。
  • 你需要解释你在做什么。更好的。如果状态取决于许多因素,那么当其中任何一个发生变化时,都会以“状态”作为参数来提高 propertychanged。如果您正在做的任何事情都在与 ui 不同的线程上,那么您将需要调度程序 invokeasync 以从该线程获取 ui,因为 propertychanged 具有线程关联性。 Propertychanged 必须从父对象引发,因此您可能需要使用视图模型中的公共属性而不是模型来包装您的逻辑或属性。

标签: c# wpf data-binding


【解决方案1】:

假设该视图模型已经实现INotifyPropertyChanged,如果您希望 UI 重新读取属性值,则必须引发 PropertyChanged 事件。这是仅获取属性还是获取/设置属性都没有关系。

由于它是get-only,你需要在更改某些内容后调用OnPropertyChanged,这会影响getter表达式结果:

private int a;
private int b;

public bool Status => a == b;

private void DoSomething()
{
    a = ...;
    b = ...;

    // ...

    OnPropertyChanged(nameof(Status));
}

【讨论】:

  • 我可以运行一个线程来监控 Status 属性并调用 OnPropertyChanged 来更新 UI。有什么简单的方法可以实现这一点(可能来自 xaml 本身)
  • @Azeeb:简单的方法是调用OnPropertyChanged。它有什么问题?
【解决方案2】:

你必须做两件事:

  1. 在包含 Status 属性的类中实现 INotifyPropertyChanged 接口。

  2. 调用 PropertyChanged 处理程序并在您将作为 INotifyPropertyChanged 的​​一部分实现的 Status 属性的设置器中调用该方法 - 如果您不知道它是什么,请用谷歌搜索它,您将获得代码 - 它基本上通知 UI 属性已更改。

  3. 如果 Status 属性只是获取,那么您必须在知道状态已更新后调用 PropertyChanged 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多