【问题标题】:WPF Multithreading and binding - no updatesWPF 多线程和绑定 - 无更新
【发布时间】:2015-01-29 11:28:35
【问题描述】:

我正在尝试在新任务期间将 ProgressBar - IsInterminate 的属性更改为 true。我已将 DataContext 添加到我的状态栏(进度条的父级)并绑定到进度条属性:

<StatusBar>
        <StatusBar.DataContext>
            <viemodel:EventsViewModel/>
        </StatusBar.DataContext>
<ProgressBar Name="pbProgress" IsIndeterminate="{Binding Pennding}"/>
</StatusBar>

在 ViewModel(实现 INotifyPropertychanged)中我添加了属性:

 private static bool _pending = false;

    public bool Pennding
    {
        get { return _pending; }
        set
        {
            _pending = value;
           NotifyPropertyChanged();
        }
    }

并尝试在命令中更改该属性:

App.Current.Invoke(() => new EventsViewModel { Pennding = true }));

但什么都没有改变!我检查了有关绑定的调试信息,没有错误。

【问题讨论】:

  • 您在 lambda 中创建的实例实际上并没有绑定到任何东西。您的 StatusBar 创建自己的实例并侦听其更改通知。但是由于您不更改该实例,因此那里没有任何反应。您可以在开始任务的地方发布您的其他 ViewModel 的代码吗?
  • pastebin.com/icipx8tn 这是我工作的命令。我已将静态 EventsViewModel 字段添加到此类并将 x:Name 添加到 DataContect 到状态栏,它可以工作 - 但我不知道为什么。
  • 你是不是一开始就设置了DataContext?
  • Tesy' 我已将上下文添加到状态栏并在调试期间检查它。

标签: c# wpf mvvm data-binding


【解决方案1】:

您需要更改已绑定的 EventsViewModel 的特定实例 - 您目前只是使用 new 语法创建一个新实例。

您的代码应该是:

<StatusBar.DataContext>
    <viemodel:EventsViewModel x:Name="MyEventVM"/>
</StatusBar.DataContext>
<ProgressBar Name="pbProgress" IsIndeterminate="{Binding Pennding}"/>

然后...

App.Current.Invoke(() => { MyEventVM.Pennding = true; }));

【讨论】:

  • 感谢您的回复。但是,如果我将属性设置回静态,我不会为每个实例使用 Pennding 属性获得相同的值?
  • 将针对当前实例(即新实例)发出通知。无法为通过更改静态支持字段绑定的实例发出通知。此外,我真的不会那样做 - 让实例成员具有静态支持字段非常令人困惑。它破坏了 SOLID。
  • 我不明白。所以我应该将“MyEventVM”添加到我的 ViewModel 类中,并与我的命令类中的名称相同?
  • 最后一点是您需要有一种方法来访问您已绑定到控件的特定实例,否则属性的更改无法正确通知 UI。
  • 由于 OP 提到了 MVVM,我假设在包含状态栏的 UserControl 后面还有另一个 ViewModel。所以 DataContext 应该通过一个绑定来设置:。当然,只要我们没有看到更多代码,这只是一个假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多