使用绑定更改网格中的用户控件
Use binding to change usercontrol in a grid
我正在创建一个 WPF 应用程序,它有一个加载其他屏幕的主屏幕。
主屏幕可以看作是一个 header/footer 模板,其中的中心部分根据我当时需要显示的内容进行了替换。 (这是一个 3 行网格,其中 usercontrol
应该放在第 1 行)。这有一个 viewmodel
正在改变 header/footer 状态。
我已经将那些变化的部分(第 1 行)实现为用户控件。
现在我想知道是否有任何方法可以使用绑定(绑定到某物..)以便我可以更改加载的 usercontrol
而不是像我现在正在做的那样从后面的代码中进行。
如果这完全违背了 MVVM 原则,请提示我应该如何处理。
谢谢!!
我觉得您应该考虑使用 WPF 的数据模板。
根据你的问题举这个例子XAML:
<Grid>
... XAML for your Header and Footer
<ContentPresenter Content="{Binding MainContent">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}">
<view:UserControlView>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
我在这里使用 ContentPresenter 作为您的内容的占位符。这绑定到主视图模型上名为 MainContent
的 属性。在您的视图模型中,您可以将 MainContent 设置为您的用户控件的视图模型。
ContentPresenter
将尝试显示它绑定到的任何对象。在此示例中,我创建了一个将特定对象类型(例如 UserControlViewModel)映射到视图(例如 UserControlView)的 DataTemplate。
您可以定义多个数据模板,以允许您的内容呈现器处理多个视图模型(或任何类型的对象):
<Grid>
... XAML for your Header and Footer
<ContentPresenter Content="{Binding MainContent">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}">
<view:UserControlView>
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodel:AnotherUserControlViewModel}">
<view:AnotherUserControlView>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
希望这能为您指明正确的方向。
您可以在 MSDN 上找到有关数据模板的更多信息:
https://msdn.microsoft.com/en-us/library/ms742521(v=vs.110).aspx
编辑:值得一提的是,您可以 在您的主视图模型中更新您的UserControl.xaml,并将其设置为MainContent 属性。那里不需要 DataTemplate,因为 ContentPresenter 知道如何呈现 UserControl。但是,这与 MVVM 背道而驰,因为您将 UI (XAML) 与您的代码 (viewmodel) 紧密耦合。
我正在创建一个 WPF 应用程序,它有一个加载其他屏幕的主屏幕。
主屏幕可以看作是一个 header/footer 模板,其中的中心部分根据我当时需要显示的内容进行了替换。 (这是一个 3 行网格,其中 usercontrol
应该放在第 1 行)。这有一个 viewmodel
正在改变 header/footer 状态。
我已经将那些变化的部分(第 1 行)实现为用户控件。
现在我想知道是否有任何方法可以使用绑定(绑定到某物..)以便我可以更改加载的 usercontrol
而不是像我现在正在做的那样从后面的代码中进行。
如果这完全违背了 MVVM 原则,请提示我应该如何处理。
谢谢!!
我觉得您应该考虑使用 WPF 的数据模板。
根据你的问题举这个例子XAML:
<Grid>
... XAML for your Header and Footer
<ContentPresenter Content="{Binding MainContent">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}">
<view:UserControlView>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
我在这里使用 ContentPresenter 作为您的内容的占位符。这绑定到主视图模型上名为 MainContent
的 属性。在您的视图模型中,您可以将 MainContent 设置为您的用户控件的视图模型。
ContentPresenter
将尝试显示它绑定到的任何对象。在此示例中,我创建了一个将特定对象类型(例如 UserControlViewModel)映射到视图(例如 UserControlView)的 DataTemplate。
您可以定义多个数据模板,以允许您的内容呈现器处理多个视图模型(或任何类型的对象):
<Grid>
... XAML for your Header and Footer
<ContentPresenter Content="{Binding MainContent">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}">
<view:UserControlView>
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodel:AnotherUserControlViewModel}">
<view:AnotherUserControlView>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
希望这能为您指明正确的方向。
您可以在 MSDN 上找到有关数据模板的更多信息:
https://msdn.microsoft.com/en-us/library/ms742521(v=vs.110).aspx
编辑:值得一提的是,您可以 在您的主视图模型中更新您的UserControl.xaml,并将其设置为MainContent 属性。那里不需要 DataTemplate,因为 ContentPresenter 知道如何呈现 UserControl。但是,这与 MVVM 背道而驰,因为您将 UI (XAML) 与您的代码 (viewmodel) 紧密耦合。