2013-07-31 105 views
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将被更新。

+2

请你的问题更简单。 –

+0

@SeyedMortezaMousavi请建议我如何做到这一点?我已经包含了我认为需要的所有信息。最后一段可能是一个独立的结论,虽然 – Andy

+1

@Andy代码示例将有助于澄清您的问题。你的构造函数,绑定和其他相关部分是什么样的? –

回答

0

它看起来像你想绑定到CurrentDatabaseManagedSelection属性。模拟这种最简单的方法就是把它添加到setter方法:

_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 }); 
    
+0

感谢您的回答!我正在尝试执行第4步,但没有SetBinding方法...我如何得到它? – Andy

+0

@我已经更新了答案(步骤4和5改变了),现在应该可行了。 –

+0

啊,谢谢。所以它!这工作。 – Andy

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 
} 
+0

感谢您的回答以及关于'Dispatcher.BeginInvoke'的提示。所以基本上你说的是,如果我的子视图模型需要一个独立于它更新的属性,我需要在子视图模型中创建一个属性,并在需要时传递更新的属性? – Andy