私はその背後にビューモデルを持つ再利用可能なusercontrolを持っています。私は同じデータの異なるビューを切り替えることを試みています。現在、これを達成するためにVMでModeプロパティを使用しようとしています。ユーザーコントロール内の同じViewModelの2つのビュー
は、私はそうのようなDataTemplateSelectorを作成しました:
class DisplayTemplateSelector : DataTemplateSelector
{
public DataTemplate ColumnTemplate {get;set;}
public DataTemplate AvatarTemplate {get;set;}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
MainViewModel vm = (MainViewModel)item;
switch (vm.Mode)
{
case MainViewModel.DisplayMode.Column:
return ColumnTemplate;
case MainViewModel.DisplayMode.Avatar:
return AvatarTemplate;
default:
return AvatarTemplate;
}
}
}
このユーザーコントロールは、mywindowの中で座っている:クラスで
<UserControl x:Class="MyUserControl">
<UserControl.Resources>
<DataTemplate x:Key="ColumnTemplate">
<StackPanel>
<Label Text="{Binding Name}"></Label>
<Label Text="{Binding Address}"></Label>
<Label Text="{Binding Occupation}"></Label>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="AvatarTemplate">
<StackPanel>
<Image Source="{Binding ProfilePicture}"></Image>
<Label Text="{Binding Name}"></Label>
</StackPanel>
</DataTemplate>
<local:DisplayTemplateSelector ColumnTemplate="{StaticResource ColumnTemplate}" AvatarTemplate="{StaticResource AvatarTemplate}" x:Key="displayTemplateSelector" />
</UserControl.Resources>
<Grid>
<ContentControl Name="cpDisplay" Content="{Binding}" ContentTemplateSelector="{StaticResource displayTemplateSelector}" />
</Grid>
</UserControl>
私のviewmodelでインスタンス化され
<Grid>
<controls:MyUserControl x:Name="MyUserControl" DataContext="{Binding}" Margin="0"/>
</Grid>
:
MyWindow w = new MyWindow(_vm);
w.Show();
問題はitem
がMainViewModel vm = (MainViewModel)item
の間nullであることです。データがバインドされる前に、データに基づいてデータテンプレートを設定しようとしているようなものですか?
データオブジェクトに基づいていない - ユーザーコントロールのプロパティまたは同様のものとして、目的のデータテンプレートを選択する方法はありますか?
みんなありがとうを、これはUIモードを制御する唯一の方法は、ビューモデルのプロパティを設定することであることを意味しますか?もしそうなら、それもそうです。 – DaveO
2番目の解決策は、私が最後にやったことにつながります。 – DaveO