Xaml 在UserControl.Resources from祖先页面中设置ViewModel
假设我有一个usercontrol,如下所示Xaml 在UserControl.Resources from祖先页面中设置ViewModel,xaml,win-universal-app,uwp,uwp-xaml,Xaml,Win Universal App,Uwp,Uwp Xaml,假设我有一个usercontrol,如下所示 <UserControl x:Class="MyApp.Controls.MyList" xmlns:local="using:MyApp.Controls" xmlns:viewModels="using:MyApp.ViewModels" > <UserControl.Resources> <viewModels:CustomerViewModel x:Key="ViewModel"/>
<UserControl
x:Class="MyApp.Controls.MyList"
xmlns:local="using:MyApp.Controls"
xmlns:viewModels="using:MyApp.ViewModels"
>
<UserControl.Resources>
<viewModels:CustomerViewModel x:Key="ViewModel"/>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource ResourceKey=ViewModel}" />
</UserControl.DataContext>
<UserControl.Content>
<ListView ItemsSource={Binding ItemList} />
</UserControl.Content>
</UserControl>
我正在页面中使用此控件:
<Page
x:Class="MyApp.Views.CustomerPage"
xmlns:control="using:MyApp.Controls">
<controls:MyList />
</Page>
到目前为止还不错
现在我想对其他ViewModels重复使用相同的控件。我的CustomerViewModel和我的所有viewmodel一样,都是从接口IViewModel继承的
对于SalesOrderViewModel,如何使用相同的控件
我尝试了以下操作,但这会在InitializeComponent()上引发XamlParseException异常:
这里的工作方法是什么?您可以为此使用数据模板。可以使用视图模型设置数据样板的数据类型
假设您的页面控件有一个视图模型。此视图模型可以具有IViewModel类型的属性,该属性可以根据某些条件进行设置。您可以将此属性绑定到内容控件或内容演示器的内容属性
内容控件将根据您选择的视图模型加载视图。视图模型(只是我的快捷键,与您的稍有不同):
用户控制:
<UserControl
x:Class="App1.MyList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TextBlock Text="{Binding Value}" />
</Grid>
</UserControl>
那么,我不是必须为每个ViewModel类型创建不同的UserControl吗?我试图实现的是对不同的ViewModel使用相同的UserControl,每个ViewModel都有一个ItemList属性。(注:usercontrol中的listview是为了简单起见。对于本例,实际上listview是一个带有rpc后端过滤的分页网格)这很好,Peter,谢谢!在重写控件中的绑定后,我使用了这个方法,指向datacontext,而不是我现在从代码中删除的staticresource。
public class ViewModel
{
public string Value { get; set; } = "Default";
}
<UserControl
x:Class="App1.MyList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TextBlock Text="{Binding Value}" />
</Grid>
</UserControl>
<Page.Resources>
<local:ViewModel x:Key="ViewModel1" Value="First"/>
<local:ViewModel x:Key="ViewModel2" Value="Second"/>
</Page.Resources>
<StackPanel>
<local:MyList DataContext="{StaticResource ViewModel1}" />
<local:MyList DataContext="{StaticResource ViewModel2}" />
</StackPanel>