Xaml 在UserControl.Resources from祖先页面中设置ViewModel

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,如下所示

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