从主窗口数据上下文视图模型标记中的子控件viewmodels属性绑定到MainWindow DataContext属性

时间:2014-11-03 18:07:31

标签: wpf xaml mvvm viewmodel datacontext

  1. 我有一个UserControl(UC1),它有一个数据上下文:ViewModelOne。
  2. 我有一个使用UC1作为子控件的MainWindow应用程序。
  3. 此MainWindow也有一个数据上下文:ViewModelTwo。
  4. 需要在视图模型的数据上下文标记声明中绑定属性,如下所示:`

    <Window x:Class="control.controlnamespace" 
    xmlns:vm="clr-namespace"..>
    <Window.DataContext>
    *<vm:ViewModelTwo Property="{Binding SomeProperty, ElementName=myControl}"/>* <-- Issue Here
    </Window.DataContext>
    
    <Grid>
       <UC1 x:Name="myControl"/>
    </Grid>
    

    我遇到麻烦的地方没有发生更新,绑定也没有发生。

2 个答案:

答案 0 :(得分:0)

我不确定但是试试这个:

在您的MainWindow.xaml中:

<Window ........ >
    <Window.DataContext>
        <vm:ViewModelOne />
    </Window.DataContext>
</Window>

在ViewModelOne中:

public class ViewModelOne : INotifyPropertyChanged
{
    .....
    .....

    private string _UCText;
    public string UCText
    {
        get
        {
            return _UCText;
        }
        set
        {
            _UCText = value;
            OnPropertyChanged("UCText");
        }
    }

    // Implement INotifyPropertyChanged
    .....
    .....
}

在您的UserControl中:

<UserControl ...... >
    <UserControl.DataContext>
        <vm:ViewModelTwo />
    </UserControl.DataContext>

    <TextBlock Text="{Binding Path=DataContext.UCText, 
                              RelativeSource={RelativeSource Mode=FindAncestor 
                                                             AncestorType={x:Type Window}}}" />

</UserControl>

如果您对上述代码有任何疑问,请随时提问。

答案 1 :(得分:0)

我找到了解决方案:

设置或尝试在窗口datacontext标记内的viewmodel声明中设置属性是错误的,并且不会产生任何影响。这是因为在设置此上下文时,它位于不同的线程下,因此不会通知更新或更改。

错误---&gt;

<Window.DataContext>
<vm:ViewModelTwo Property="{Binding SomeProperty, ElementName=myControl}"/>* <-- Issue Here
</Window.DataContext>

所以解决这个问题的方法是实际获取当前加载的元素(这可能是用户控件,窗口等) 正确 - &gt;

<Window Name="myWindowName">
    <Window.DataContext>
         <vm:ViewModel />
     </Window.DataContext>

     <control:Control x:Name="myControl" PropertyToBind="{Binding Path=DataContext.Property, Mode=TwoWay, ElementName=myWindowName or myUserControlName}" >
</Window>