【问题标题】:Proper way to assign and work with WPF DataContext in Resources在资源中分配和使用 WPF DataContext 的正确方法
【发布时间】:2013-04-30 05:22:39
【问题描述】:

我的应用程序需要打开一个UserControl,它需要一个parameter/property 才能包含一年。 今年我将让我的控件显示一些编辑值。

我遇到了一个问题,我声明的Window.Resource 部分有一个contextmenu,我正在连接到Gridview。从资源中的这个contextmenu 中,我无法直接绑定到我的ViewModel 上的Commands

我通过在我的Xaml 中添加我的ViewModel 作为StaticResource 解决了这个问题。不幸的是,这会导致我的 xaml 生成我的 ViewModel,并且我无法传递我的参数或属性“年份”,并且当我检索我的数据时,它是为 year=0 完成的。

有没有办法替换我为上下文菜单提供的视图模型绑定,以便它可以访问我在代码中设置的视图模型?

<UserControl.Resources>
    <vm:ViewModel x:Key="viewModel" />

    <ribbon:ContextMenu x:Key="MyContextMenu"
                         x:Shared="False"
                         Placement="MousePoint" >
        <ribbon:Menu Focusable="false">
            <ribbon:Button 
                Command="{Binding Source={StaticResource viewModel}, Path=MyCommand}"
                Label="MyLabel"/>
        </ribbon:Menu>
    </ribbon:ContextMenu>

</UserControl.Resources>

【问题讨论】:

    标签: wpf xaml mvvm


    【解决方案1】:

    是的,这是可能的。您可以创建一个包含 DataContext 的虚拟类:

    public class Proxy:DependencyObject
    {
        public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(Proxy));
        public object Data 
        {
            get { return this.GetValue(DataProperty); }
            set { this.SetValue(DataProperty, value); }
        }
    }
    

    在资源中引用它并将 DataContext 绑定到它的 Data-property:

    <UserControl.Resources>
        <local:Proxy x:Key="proxy" Data="{Binding}"/>
    </UserControl.Resources>
    

    现在 Data 属性保存了您的 ViewModel,您可以像这样绑定到它:

    <ribbon:ContextMenu x:Key="MyContextMenu"
                         x:Shared="False"
                         Placement="MousePoint" >
        <ribbon:Menu Focusable="false">
            <ribbon:Button 
                Command="{Binding Source={StaticResource proxy}, Path=Data.MyCommand}"
                Label="MyLabel"/>
        </ribbon:Menu>
    </ribbon:ContextMenu>
    

    【讨论】:

    • 我可以使用这个 :) 我将尝试实现这一点,将静态当前属性添加到我的 ViewModel 并为其分配正确的属性:)
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多