【问题标题】:Property that changes in constructor or as property在构造函数中更改的属性或作为属性
【发布时间】:2013-08-01 10:10:00
【问题描述】:

我正在使用 MVVM 模式使用 C#。我有两个 WPF 窗口,每个窗口都有一个视图模型。基本上我需要将主视图模型的属性传递给“子”视图模型。目前,我通过在主视图模型的构造函数中设置一个与新视图模型相等的私有变量来做到这一点,并在子视图模型的构造函数中传递属性。

但是,有一个依赖属性链接到该属性,因为它用作组合框中所选项目的绑定。因此,在子视图模型初始化后很可能会发生变化,但是通过在构造函数中传递属性,我的子视图模型不会发生变化。

那么,无论如何,我是否可以将属性传递给构造函数,并在子视图模型中更改它在主视图模型中?还是我必须在子视图模型中创建一个属性,每次设置主视图模型中的属性时都会更新该属性?

希望这是有道理的。

编辑在我的主视图模型中,我声明以下内容:

public readonly DependencyProperty CurrentDatabaseManagedProperty = DependencyProperty.Register("CurrentDatabaseManaged", typeof(DatabaseInfo), typeof(MainViewModel));
public DatabaseInfo CurrentDatabaseManaged {
    get { return (DatabaseInfo)GetValue(CurrentDatabaseManagedProperty); }
    set { SetValue(CurrentDatabaseManagedProperty, value); }
}

public DatabaseInfo CurrentDatabaseManagedSelection {
    get { return CurrentDatabaseManaged; }
    set {
        if (CurrentDatabaseManaged != null &&
            (String.Equals(value.Name, CurrentDatabaseManaged.Name, StringComparison.OrdinalIgnoreCase))) return;

            CurrentDatabaseManaged = (value.IsUsable ? value : dbm.ReadDatabase(value.FileName));
        }
}

其中CurrentDatabaseManagedSelection 是组合框的SelectedItem。在主视图模型的构造函数中,我有以下内容:

_DatabaseVM = new ChildViewModel(CurrentDatabaseManaged);

ChildViewModel的构造函数是这样的:

public ChildViewModel( DatabaseInfo SelectedDatabase)
  {
    if (SelectedDatabase != null)
         _SelectedDatabase = SelectedDatabase;
    }
  }

基本上我希望_SelectedDatabaseCurrentDatabaseManagedSelection 出现时更新。

【问题讨论】:

  • 请让您的问题更简单。
  • @SeyedMortezaMousavi 请建议我该怎么做?我已经包含了我认为需要的所有信息。最后一段可能是一个独立的结论
  • @Andy 代码示例将有助于澄清您的问题。您的构造函数、绑定和其他相关部分是什么样的?
  • @TimS。好的,我将稍微编辑一下我的代码,以便我可以将其发布在这里。请和我一起裸露
  • 我同意@SeyedMortezaMousavi 的观点。在您的第一段中,您是说,您在父视图模型中创建子视图模型并将对象传递给子视图模型的构造函数,对吗?在你的第二段中,这个依赖属性在哪里?在父视图或子视图中?您希望当属性从 dp 更改时,它也会影响子视图模型内的属性?我认为一些代码会使它更清晰。

标签: c# wpf mvvm properties constructor


【解决方案1】:

您似乎想绑定到CurrentDatabaseManagedSelection 属性。最简单的模拟方法是将其添加到该属性的设置器中:

_DatabaseVM._SelectedDatabase = value;

要使用实际绑定,您需要

  1. 使ChildViewModel._SelectedDatabase成为一个依赖属性,
  2. 使MainViewModel实现INotifyPropertyChanged,然后
  3. CurrentDatabaseManagedSelection 的设置器中调用PropertyChanged 事件。
  4. 使ChildViewModel 扩展DependencyObject
  5. 不只是设置属性,而是设置绑定,例如

    BindingOperations.SetBinding(this, _SelectedDatabaseProperty,
      new Binding("CurrentDatabaseManagedSelection") { Source = mainViewModel });
    

【讨论】:

  • 感谢您的回答!我正在尝试执行第 4 步,但没有 SetBinding 方法...我如何获得它?
  • @Andy 我已经更新了答案(步骤 4 和 5 已更改),现在应该可以了。
【解决方案2】:

您必须稍后在 UI 中设置绑定后更改该值。

使用Dispatcher.BeginInvoke 方法将属性的更新推迟到以后。

public MyClass(object someValue)
{
    Dispatcher.BeginInvoke(
        (Action)(() => Property = someValue),  // the cast may not be required
        DispatcherPriority.ApplicationIdle);  // runs after everything is loaded
}

【讨论】:

  • 感谢您的回答和关于Dispatcher.BeginInvoke 的提示。所以基本上你的意思是,如果我的子视图模型需要一个独立更新的属性,我需要在子视图模型中创建一个属性并在需要时传递更新的属性?
猜你喜欢
  • 2013-03-22
  • 2015-09-02
  • 2016-11-04
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多