2012-04-11 7 views
0

私は現時点でWPFを学んでいます。私はxamlを使うのがかなり難しいと思っています。データバインドされたviewmodelのタイプに基づいてコントロールを表示していますか?

<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をオーバーライドしています:

<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はこのようなものです。このような

<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:私はこのように定義さMainWindow.xamlを持っています

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(); 

ただし、ウィンドウに何も表示されません。

私はコントロールをレンダリングするためにthis questionの答えを使用しました。しかし、これはコードからビュー内の要素を参照する必要がありますが、これは実行したくありません。

ViewModelをdatacontextに設定して、表示するビューを選択するウィンドウを取得することはできますか? MVVMがどのように機能するのか、間違った考えがありますか?

答えて

1

あなたは正しい考えを持っていますが、あなたは実際に私は、単一のViewModel

<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オブジェクトで ViewModelをホストあなたの ViewModelどこでも

を表示するには、WPFを言っていません

ModelsまたはViewModelsのリストでは、オブジェクトがそれぞれのアイテムのContentPresenterContentプロパティとして自動的に挿入されるため、通常ContentControlは不要です。 ViewModels

<ListBox ItemsSource="{Binding MyCollectionOfViewModel}" /> 
+0

ニート、感謝のコレクションにListBoxを結合する場合たとえば、何ContentControlは必要ありません。 DataContext = "{RelativeSource = {RelativeSource Self}}"という行が私のウィンドウ定義に現れた(私はそこに置かなかったと確信しています...)私はそれを削除した後に働いた。 – Oliver

+0

@Oliverバインディングで 'Self'を参照すると、バインディングソースは' DataContext'ではなくUIオブジェクトに設定されます – Rachel

関連する問題