0

我正在使用 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;
    }
  }

基本上我想_SelectedDatabase随时更新CurrentDatabaseManagedSelection

4

2 回答 2

1

在 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
}
于 2013-07-31T18:26:28.323 回答
0

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

_DatabaseVM._SelectedDatabase = value;

要使用实际绑定,您需要

  1. 创建ChildViewModel._SelectedDatabase一个依赖属性,
  2. 制作MainViewModel工具INotifyPropertyChanged,和
  3. 在 的设置器中调用PropertyChanged事件CurrentDatabaseManagedSelection
  4. 使ChildViewModel扩展DependencyObject
  5. 而不是仅仅设置属性,设置绑定,例如

    BindingOperations.SetBinding(this, _SelectedDatabaseProperty,
      new Binding("CurrentDatabaseManagedSelection") { Source = mainViewModel });
    
于 2013-07-31T19:04:28.790 回答