0

我现在正在学习WPF。我发现 xaml 很难使用。我是这样MainWindow.xaml定义的:

<Window x:Class="Compliance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>

像这样MainWindow.Resources.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:Compliance.ViewModel"
    xmlns:vw="clr-namespace:Compliance.View">

    <DataTemplate DataType="{x:Type vm:Entities.AbstractEntityViewModel}">
        <vw:AbstractEntityView></vw:AbstractEntityView>     
    </DataTemplate>        
</ResourceDictionary>

AbstractEntityView是这样的:

<UserControl x:Class="Compliance.View.AbstractEntityView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <Label Content="ID:"></Label>
        <TextBlock Text="{Binding Path=EntityId}"></TextBlock>
    </StackPanel>
</UserControl>

然后在App.xaml.cs我这样覆盖OnStartup

MainWindow window = new MainWindow();

    //Model class
Individual ind = new Individual(1,"Name");

    //subclass of AbstractEntityViewModel
var vm = new Entities.IndividualEntityViewModel(ind);

window.DataContext = vm;
window.Show();

但是,窗口中没有任何内容。

我使用这个问题的答案来控制渲染。但是,这需要您从代码中引用视图中的元素,而我不想这样做。

是否有可能让一个窗口根据 ViewModel 设置为它的数据上下文来选择一个要呈现的视图?或者我对 MVVM 应该如何工作有错误的想法?

4

1 回答 1

1

你有正确的想法,但你实际上并没有告诉 WPF 在ViewModel任何地方显示你的

如果我绑定到单个 ViewModel ,我通常会ViewModel在对象中托管ContentControl

<Window x:Class="Compliance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary>
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding }" />
    </Grid>
</Window>

或的ContentControl列表通常不需要,因为该对象会自动作为每个项目的属性插入。例如,将 a绑定到ModelsViewModelsContentContentPresenterContentControlListBoxViewModels

<ListBox ItemsSource="{Binding MyCollectionOfViewModel}" />
于 2012-04-11T15:04:49.490 回答