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

あなたは正しい考えを持っていますが、実際にはViewModelどこにでも表示するようにWPFに指示しているわけではありません

単一の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 に答える