如何将UserControl加载到(WPF)窗口中的ContentPresenter中?

Jac*_*win 1 wpf user-controls mvvm contentpresenter

我有一个包含Viewbox的窗口.在那个Viewbox中,我想拥有一些我已经创建为UserControls的视图.我正在使用MVVM(模型视图 - 模型)设计模式.我在网上搜索了大约一个小时,我找不到任何解释如何使用a显示UserControl的示例或教程ContentPresenter.

小智 8

要看.

我认为你的主要问题是a ContentPresenter只在控件模板中使用.你不能只是把它粘在一个窗口中,并期望它显示窗口的内容.我相信你真正需要做的是使用ContentControl来托管你的UI.

通过将模型绑定Content到此控件的属性,可以设置包含该模型的预期视图的DataTemplates.我会给你一个简短的例子.请注意,这可能与您的设计不符,但它演示了如何将它们结合在一起.

首先,为每个视图创建一个Model(或ViewModel),用于管理该视图的数据(和交互).

public sealed class Dialog : INotifyPropertyChanged // or DependencyObject
{
    public string Input {get;set;} // INPC or DP implementation not shown
    public ICommand Cancel {get;set;}
    // class definition not shown
}
Run Code Online (Sandbox Code Playgroud)

接下来,定义要在ContentPresenter中显示的视图

<UserControl x:Class="Herp.DialogView" 
    HideImplementationDetails="true">
    <Border BorderBrush="Red" BorderThickness="5">
        <TextBlock Text="{Binding Input}" />  
        <Button Command="{Binding Cancel}">Cancel</Button>
        <!-- etc etc -->      
    </Border>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

接下来,在窗口中,添加ContentControl和DataTemplate

<Window HideImplementationDetailsForBrevityOfXaml="true">
    <Window.Resources>
        <DataTemplate xmlns:t="clr-namespace:Herp" 
            DataType="{x:Type t:Dialog}">
            <t:DialogView />
        </DataTempalte>
    </Window.Resources>
    <ContentControl Content="{Binding}" />
</Window>
Run Code Online (Sandbox Code Playgroud)

最后将Window的DataContext设置为您的Dialog模型.

public MyWindow()
{
    InitializeComponent();
    DataContext = new Dialog();
}
Run Code Online (Sandbox Code Playgroud)

这就是逻辑流程:

  1. 您的窗口已创建.
  2. 在DataContext上设置Dialog控件的实例.
  3. ContentControl上的绑定已更新
  4. 搜索资源的默认DataTemplateSelector,其设置为ContentControlDataTemplateDataTypetypeof(Dialog)
  5. 它在Window的资源中找到了这个DataTemplate
  6. DataTemplate的内容被加载并作为视觉子项添加ContentControl

任何时间ContentContentControl变化,同样的过程重复.因此,您可以拥有许多不同的模型,每个模型都有一个包含不同UserControl的不同DataTemplate,每次更新ContentControl上的绑定时,您都会看到预期的View.

使用MVVM,您可以将ViewModel的Content属性绑定到属性(称为Current或其他),然后根据ViewModel的当前状态将属性中的模型切换为期望值.请注意,在ContentControl中,设置为Content属性的任何内容都将成为DataContextContentControl的直接子项.类似于a中的每个ItemsSource内容ItemsControl是如何DataContext定义在内的可视树ItemTemplate.