1

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

我有DataContext使用以下语法绑定到视图的菜单项:

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

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

grid.AddChildren(wd.View)

view 的类型在哪里UIElement

我宁愿在我的 XAML 文件中添加对它的引用,而不在我的代码隐藏中添加任何内容,以便我可以将 XAML 主要用作皮肤。是否可以使用仅从UIElementXAML 文件的数据上下文中获取标签的标签?

4

2 回答 2

4

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

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

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

为了处理这个问题,我将创建一个 ViewLocator 类并将它的一个实例放入您的资源字典中。然后使用这个:

<ContentControl Content={Binding Source={StaticResource ViewLocator}, Path=WorkflowDesigner} />
于 2011-02-16T22:41:29.573 回答
0

我不确定我是否完全理解您的问题,但是如果您希望从 ViewModel 在视图ItemsControl中显示一个类,您可以使用DataTemplate.

说你有课User

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;
        }
    }
}

在 UserView 中,您可以

<ItemsControl ItemsSource="{Binding Users}">
    <ItemsControl.Resources>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
               <TextBlock Text="{Binding Id}" />
               <TextBlock Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>

这样,用户将使用上面声明的模板显示在视图中。那么您就不必UIElement在 ViewModel 中使用 s 了。

The ItemsControl could refer to grid items, and have items presented in a grid with SharedGridScope (if I remember correctly).

于 2011-02-26T02:41:32.363 回答