从XAML引用ViewModel中的UIElement

时间:2011-02-16 21:55:39

标签: wpf xaml binding uielement

我使用WPF和MVVM架构相对较新。我有一个关于从XAML窗口DataContext引用UIelements的问题。

我使用以下语法绑定了Views DataContext的菜单项:

<MenuItem Header="About" Command="{Binding AboutCommand}" />

我想使用类似的范例将项目添加到网格中。现在我正在使用一个WorkflowDesigner类。我可以使用ViewModel中的以下代码将其添加到我的网格中:

grid.AddChildren(wd.View)

其中视图的类型为UIElement

我宁愿做的是添加是从我的XAML文件中引用它而不在我的代码隐藏中添加任何内容,以便我可以将XAML主要用作皮肤。是否可以使用标记从XAML文件的datacontext中获取其UIElement

2 个答案:

答案 0 :(得分:4)

这是可能的,但让ViewModel为您的视图提供控件并不符合MVVM的精神。理想情况下,您的ViewModel根本不应该依赖于System.Windows.Controls。

如果必须,那么您可以使用ContentControl

<ContentControl Content={Binding wd.View} />

为了解决这个问题,我将创建一个ViewLocator类并将其实例放入资源字典中。然后使用:

<ContentControl Content={Binding Source={StaticResource ViewLocator}, Path=WorkflowDesigner} />

答案 1 :(得分:0)

我不确定我是否完全理解您的问题,但如果您希望从ViewModel中显示您的视图中的类,则可以使用ItemsControl使用{{1}显示不同的类}}

假设您有课程DataTemplate

User

在UserView中,您可以拥有

public class User
{
    public string Id { get; set;}
    public string Name { get; set;}
}


public class UserViewModel
{
    private ObservableCollectionaUser<User> _users = new......
    public ObservableCollection<User> Users
    {
        get
        {
            return _users;
        }
    }
}

这样,用户将使用上面声明的模板在视图中显示。然后,您不必在ViewModel中使用<ItemsControl ItemsSource="{Binding Users}"> <ItemsControl.Resources> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Id}" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </DataTemplate> </ItemsControl.Resources> </ItemsControl>

UIElement可以引用网格项目,并使用SharedGridScope在网格中显示项目(如果我没记错的话)。