我正在使用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
更新{。}}。
答案 0 :(得分: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
}
答案 1 :(得分:0)
看起来您想要绑定到CurrentDatabaseManagedSelection
属性。模拟这个的最简单方法是将其添加到该属性的setter中:
_DatabaseVM._SelectedDatabase = value;
要使用实际绑定来执行此操作,您需要
ChildViewModel._SelectedDatabase
成为依赖属性,MainViewModel
实施INotifyPropertyChanged
和PropertyChanged
。CurrentDatabaseManagedSelection
事件
ChildViewModel
延长DependencyObject
而不是仅设置属性,设置绑定,例如
BindingOperations.SetBinding(this, _SelectedDatabaseProperty,
new Binding("CurrentDatabaseManagedSelection") { Source = mainViewModel });