我使用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
?
答案 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在网格中显示项目(如果我没记错的话)。