【问题标题】:What's wrong with this binding?这个绑定有什么问题?
【发布时间】:2012-06-26 06:46:21
【问题描述】:

我正在尝试将 DataContext 分配给一个 MenuItem,它是 ListBox 的一部分。

    <Style x:Key="ContextMenuStyle" TargetType="telerik:RadMenuItem">
        <Setter Property="DataContext" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=telerik:RadListBox}, Path=DataContext}" />
    </Style>

     <DataTemplate x:Key="TemplateSelector">
            <ContentPresenter Content="{Binding}" Name="contentPresenter">
                <telerik:RadContextMenu.ContextMenu>
                    <telerik:RadContextMenu>
                        <telerik:RadMenuItem Header="Connect" Click="RadMenuItem_Click" Style="{StaticResource ResourceKey=ContextMenuStyle}" />
                        <telerik:RadMenuItem Header="Disconnect" />
                        <telerik:RadMenuItem Header="Delete Database" />
                    </telerik:RadContextMenu>
                </telerik:RadContextMenu.ContextMenu>
            </ContentPresenter>
     </DataTemplate>


    <Grid>
        <telerik:RadListBox x:Name="lsbDevices" ItemsSource="{Binding Path=Devices}" ItemTemplate="{StaticResource TemplateSelector}" 
                            SelectedItem="{Binding SelectedDevice, Mode=TwoWay}" Grid.Row="0" />
    </Grid>

这就是我所做的。 RadListBox 的 DataContext 设置为我的 ViewModel。我想通过 ContextMenuStyle 将此 ViewModel 分配给每个 RadMenuItem 的 DataContext,但它不起作用。 RadListBox 的 DataContext 已正确设置为我的模型视图,但 RadMenuItem 的 datacontext 为空。我错过了什么?

谢谢

【问题讨论】:

    标签: wpf xaml mvvm binding styles


    【解决方案1】:

    ContextMenus 与 UI 的其余部分不属于同一 VisualTree,因此您的 RelativeSource 绑定找不到 ListBox

    您可以使用ContextMenuPlacementTarget 属性找到ContextMenu 附加到的UI 对象

    <Style x:Key="ContextMenuStyle" TargetType="telerik:RadMenuItem">
        <Setter Property="DataContext" Value="{Binding PlacementTarget.DataContext, 
            RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerik:RadContextMenu}}}" />
    </Style>
    

    【讨论】:

    • 看来telerik 改变了主意,而不是PlacementTarget 现在应该使用UIElement。对于使用RadTreeView 的用户,可以使用{Binding UIElement.ParentTreeView.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerik:RadContextMenu}}} 绑定数据上下文(请注意添加的ParentTreeView)。
    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多