C# 在构造函数中更改的属性或作为属性更改的属性

C# 在构造函数中更改的属性或作为属性更改的属性,c#,wpf,mvvm,properties,constructor,C#,Wpf,Mvvm,Properties,Constructor,我正在使用MVVM模式与C#一起工作。我有两个WPF窗口,每个窗口都有一个视图模型。基本上,我需要将主视图模型的属性传递给“子”视图模型。目前,我通过在主视图模型的构造函数中设置一个等于新视图模型的私有变量,并在子视图模型的构造函数中传递属性来实现这一点 但是,有一个依赖项属性链接到该属性,因为它用作组合框中选定项的绑定。因此,在初始化子视图模型之后,它可能会发生更改,但通过在构造函数中传递属性,不会在我的子视图模型中进行更改 那么,我是否可以将属性传递到构造函数中,并在主视图模型中更改它时在子

我正在使用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));
        }
}
_DatabaseVM = new ChildViewModel(CurrentDatabaseManaged);
其中,
CurrentDatabaseManagedSelection
是组合框的SelectedItem。在主视图模型的构造函数中,我有以下内容:

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));
        }
}
_DatabaseVM = new ChildViewModel(CurrentDatabaseManaged);
ChildViewModel
的构造函数如下所示:

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

基本上,我希望无论何时
CurrentDatabaseManagedSelection
更新
\u SelectedDatabase

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

使用该方法将推迟更新属性,直到稍后

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

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

_DatabaseVM._SelectedDatabase = value;
要使用实际绑定,您需要

  • ChildViewModel.\u选择的数据库
    a dependency属性
  • 使
    MainViewModel
    实现
    INotifyPropertyChanged
    ,以及
  • CurrentDatabaseManagedSelection
    的setter中调用
    PropertyChanged
    事件
  • 使
    ChildViewModel
    extend
  • 不只是设置属性,而是设置绑定,例如

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

  • 请简化你的问题。@SeyedMortezaMousavi请建议我如何做到这一点?我已经包括了我认为需要的所有信息。最后一段可以是一个独立的结论though@Andy代码示例将有助于澄清您的问题。您的构造函数、绑定和其他相关部分是什么样子的?@TimS。好的,我只需要编辑一下我的代码,这样我就可以在这里发布了。请同意我对@SeyedMortezaMousavi的看法。在第一段中,您是说,在父视图模型中创建子视图模型,并将对象传递给子视图模型的构造函数,对吗?在第二段中,这个依赖属性在哪里?在父视图还是子视图中?您希望当属性从dp更改时,它也会影响子视图模型中的属性吗?我想一些代码会让它更清晰。谢谢你的回答和关于
    Dispatcher.BeginInvoke
    的提示。因此,本质上你是说,如果我的子视图模型需要一个独立于它更新的属性,我需要在子视图模型中创建一个属性,并在需要时传递更新的属性?谢谢你的回答!我试着做第4步,但没有挫折的方法。。。我如何得到它?@Andy我已经更新了答案(第4步和第5步已更改),现在应该可以了。