WPF-MVVM:来自不同项目的UserControl之间的绑定

WPF-MVVM:来自不同项目的UserControl之间的绑定,wpf,xaml,mvvm,binding,Wpf,Xaml,Mvvm,Binding,我有一个项目解决方案如下 开始窗口是位于ProjectStart.View中的MainWindowsStart.xaml,使用Datacontext ProjectStartViewModel.cs进行查看 mainWindowsStart.xaml包括两个用户控件(MyUC1.xaml,MyUC2.xaml),它们位于具有DataContextProject1ViewModel.cs的不同项目(Project1)中 . 属性在MainWindow的InitializeComponent()上

我有一个项目解决方案如下

开始窗口是位于ProjectStart.View中的MainWindowsStart.xaml,使用Datacontext ProjectStartViewModel.cs进行查看

mainWindowsStart.xaml包括两个用户控件(MyUC1.xaml,MyUC2.xaml),它们位于具有DataContextProject1ViewModel.cs的不同项目(Project1)中 . 属性在MainWindow的InitializeComponent()上正确绑定,但在属性更改时不起作用。 当用户控件包含在位于用户控件的某个项目中的窗口中时,它可以正常工作

这是ViewModel ViewModel中的属性代码

 private int _IndexTabMain;

    public int IndexTabMain
    {
        get { return _IndexTabMain; }
        set
        {
            if (_IndexTabMain != value)
            {
                _IndexTabMain = value;
                this.RaisePropertyChanged("IndexTabMain");
            }

        }
    }
这是绑定在MyUC2.xaml中的属性代码,从MyUC1.xaml中的选择更改中得到通知

  <TextBlock Text="{Binding DataContext.IndexTabMain, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}">

提前谢谢你
Manuel

如果在父窗口的视图模型中定义了
IndexTabMain
,则应将
AncestorType
属性设置为
window

<TextBlock Text="{Binding DataContext.IndexTabMain, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=Window}}">


一般来说,您不应该显式设置UserControl的DataContext。这样做可以有效地防止从父控件或窗口继承DataContext,这通常会破坏绑定。例如,请参见此处:IndexTabMain属性在哪里定义?您的用户控件应在绑定ViewModel的曲面上公开DependencyProperties。就像文本框具有文本属性一样,用户控件也应该具有绑定到视图模型的Whatever属性的Whatever属性。