将Viewmodel绑定到控件WPF

时间:2019-03-12 10:20:11

标签: c# wpf

我目前在项目中遇到问题,我将主视图模型的绑定传递到了上下文菜单。

第一次打开上下文菜单(显然使用鼠标右键)会给我这个错误

  

System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“ TextBlock”(名称=“)”上找不到'(attached:DependencyObjectAttached.DataContextEx)'属性。 BindingExpression:Path = PlacementTarget。(附加:DependencyObjectAttached.DataContextEx).QuotationCommandProcessor.ConvertProductCommand; DataItem ='ContextMenu'(Name ='');目标元素是'MenuItem'(Name ='');目标属性为“命令”(类型为“ ICommand”)

由于绑定第二次打开上下文菜单成功,所以这可能并不重要,但是像我以前的OCD一样,我希望解决此问题。

这就是我所拥有的

  • 我有一个Page,在页面内部是一个Datagrid,Datagrid有一个Column,其单元格模板是ContextMenu的PlacementTarget。
  • 上下文菜单命令绑定到页面视图模型的命令

我使用的实现是通过这样的附加属性

<DataGrid ItemSource="{Binding MyItemSources}">
    <DataGrid.Columns>
        <DataGridTemplateColumn CellTemplate="{StaticResource MyCellStyle}"/>
    <DataGrid.Columns>
</DataGrid>

样式看起来像这样

<DataTemplate x:Key="MyCellStyle">
   <TextBlock Text="{Binding}" attached:DependencyObjectAttached.DataContextEx="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type local:MyPage}}}">
      <TextBlock.ContextMenu>
         <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
            <MenuItem Header="Click Here To Run Command" Command="{Binding PlacementTarget.(attached:DependencyObjectAttached.DataContextEx).CommandFromTheViewModel, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" CommandParameter="{Binding}"/>
         </ContextMenu>
      <TextBlock.ContextMenu>
   </TextBlock>
</DataTemplate>

DependencyObjectAttached.DataContextEx

  

attached:DependencyObjectAttached.DataContextEx

是用于将viewmodel传递到上下文菜单的附加属性

我已经尝试使用放置目标的标签(文本块),并且工作正常,但是,我将标签用于其他目的,因此附加属性是我能想到的唯一选择。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

请尝试以下代码,以实现对主窗口或Page的数据上下文的访问。

技巧不是创建一个DataTemplate而是直接将ContextMenu创建为资源,然后将该上下文菜单用于DataGridCell,如下所示。

<Window.Resources>
        <ContextMenu x:Key="ContextMenu1">
            <ContextMenu.Items>
                <MenuItem Header="{Binding DataContext.Title,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window} }"/>
                <MenuItem Header="{Binding DataContext.Title,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
                <MenuItem Header="{Binding DataContext.Title,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
            </ContextMenu.Items>
        </ContextMenu>
    </Window.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding VentingTypesCollection}">
            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Setter Property="ContextMenu" Value="{StaticResource ContextMenu1}" />
                </Style>
            </DataGrid.CellStyle>
        </DataGrid>
    </Grid>

请记住,DataContext.Title属性是我的视图模型中的一个简单字符串属性。

我认为,一旦实现了对数据上下文的访问,从viewmodel绑定任何内容将非常简单。 希望对您有帮助。