【问题标题】:Access userctrol's datacontext does not work for me访问 userctrol 的 datacontext 对我不起作用
【发布时间】:2016-11-03 12:53:10
【问题描述】:

在 wpf mvvm 模式下,我有一个这样的用户控件

<UserControl  MyControl>
  <Grid>
    <DataGrid
       ItemsSource="{Binding MySource}"         
       Visibility = "{Binding the usercontrol's datacontext.UserGrade}"
    />
  </Grid>
</UserControl>

在我的 MainPageView 中我这样使用它

<Window:MainPageView
   xmlns:vm="clr-namespace:My.ViewModel"
   xmlns:userCtl="clr-namespace:My.Controls"
   <Window.DataContext>
     <vm:MainPageViewModel/>
   </Window.DataContext>
   <userCtl:MyControl>
     <userCtl:Mycontrol.DataContext>
        <vm:MyControlViewModel/>
     </userCtl:Mycontrol.DataContext>
   <userCtl:MyControl>
</Window:MainPageView>

现在的问题是,如何访问 MyUserControl 的 datacontext.UserVisiable,并绑定到 MyUserControl 的数据网格可见性?我尝试使用 {RelativeSource FindAncestor, AncestorType={x:Type UserControl}} 但它不起作用,还是我做错了?谢谢!

【问题讨论】:

  • 你想访问Window的属性,但是使用UserControl输入FindAncestor...为什么?
  • 一切正常,因为我的视图模型在基础视图模型中具有相同的属性
  • 您想访问 MyUserControl 的 datacontext.Visibility。 MyControlViewModel 上有 Visibility 属性吗?
  • 是的,我有一个可见性属性
  • FindAncestor 很烂。只需给根一个不同的名称(一个 guid 甚至可以)并使用 ElementName=whatevs。

标签: c# wpf mvvm binding datacontext


【解决方案1】:

你可以试试这个:

        <Grid>
        <DataGrid ItemsSource="{Binding MySource}"    
                  Visibility = "{Binding DataContext.UserGrade, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
    </Grid>

说明:将RelativeSource 用于绑定源,可帮助您将可视树导航到指定类型的当前控件的第一个祖先(UserControl)。然后它使用 UserControl.DataContext.UserGrade 作为绑定属性。

如果 Usercontrol.DataContext 为 null,则绑定将不起作用。如问题中所述,userControl 具有包含该属性的 DataContext。

另外,您可以尝试设置AncestorType=location:MyControl,以防 UserControl 不够用。 (location:就是你的控件所在的命名空间)

【讨论】:

  • 不要只发布一些没有 cmets 的代码,您应该在回答中解释它为什么有效以及您解决了哪些问题。
猜你喜欢
  • 1970-01-01
  • 2019-06-29
  • 2012-06-29
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2011-03-13
相关资源
最近更新 更多