如何根据命令切换视图

时间:2010-04-20 13:05:52

标签: c# wpf

我有一个主视图和许多用户控件。

主视图包含一个两列网格,第一列填充了一个列表框,其datatemplate包含一个usercontrol,另一列填充了另一个usercontrol。这两个用户控件具有相同的datacontext。

的MainView:

<Grid>
    //Column defs
    ...
    <ListView Grid.Column="0" ItemSource="{Binding FooList}">
        ...
        <DataTemplate>  
            <Views: FooView1 />  
        </DataTemplate>
    </ListView>
    <TextBlock Text="{Binding FooList.Count}" />
    <StackPanel Grid.Column="1">
        <Views: FooView2 />
    </StackPanel>
<Grid>

FooView1:

<UserControl>
    <TextBlock Text="{Binding Foo.Title}">
</UserControl>

FooView2:

<UserControl>
    <TextBlock Text="{Binding Foo.Detail1}">
    <TextBlock Text="{Binding Foo.Detail2}">
    <TextBlock Text="{Binding Foo.Detail3}">
    <TextBlock Text="{Binding Foo.Detail4}">
</UserControl>

我这里没有IDE。如果有任何语法错误

,请原谅

当用户点击按钮时。这两个用户控件必须由另外两个用户控件替换,因此datacontext更改,主ui保持不变。

即BarView1的FooView1和BarView2的FooView2

简而言之,我想将主视图中的视图更改绑定到我的命令(来自Button的命令)

我该怎么做?

还告诉我是否可以合并usercontrol对,以便每个viewmodel只存在一个视图

即FooView1和FooView2进入FooView等等......

2 个答案:

答案 0 :(得分:1)

虽然我仍然不确定我是否有你,但我建议如下。

在您的示例中,您似乎想要显示 Foo 对象的详细信息。 datacontext保持不变。也许您可以在viewmodel中设置Visibility-Flags来决定要显示的内容。这可以使用按钮执行的命令来完成。

<强> FooView:

<UserControl> 
    <TextBlock Text="{Binding Foo.Title}"
               Visibility="{Binding ShowTitle}">
    <TextBlock Text="{Binding Foo.Detail1}"
               Visibility="{Binding ShowDetails}"> 
    <TextBlock Text="{Binding Foo.Detail2}"
               Visibility="{Binding ShowDetails}">
    <TextBlock Text="{Binding Foo.Detail3}"
               Visibility="{Binding ShowDetails}">
    <TextBlock Text="{Binding Foo.Detail4}"
               Visibility="{Binding ShowDetails}">
</UserControl>

这是一个可能的解决方案吗?

如果您想更改数据模板,可以执行以下操作:

FooView(第二版)

<UserControl>
<UserControl.Resources>
    <DataTemplate x:Key="dataTemplate1">
        <TextBlock Text="{Binding Foo.Title}">
    </DataTemplate>
    <DataTemplate x:Key="dataTemplate2">
        <TextBlock Text="{Binding Foo.Detail1}"> 
        <TextBlock Text="{Binding Foo.Detail2}">
        <TextBlock Text="{Binding Foo.Detail3}">
        <TextBlock Text="{Binding Foo.Detail4}">
    </DataTemplate>
</UserControl.Resources>
   <Style x:Key="Default">
       <Style.Triggers>
           <DataTrigger Binding="{Binding Foo.ShowFooView}" Value="1" >
               <Setter Property="Template" Value="{StaticResource dataTemplate1}" />
           <DataTrigger>
           <DataTrigger Binding="{Binding Data.ShowFooView}" Value="2" >
               <Setter Property="Template" Foo="{StaticResource dataTemplate2}" />
           </DataTrigger>
       </Style.Triggers>
   </Style>
</UserControl>

这个想法是,根据属性 Foo.ShowFooView ,你决定应该使用哪个数据模板。当然 Foo 类型应该实现 INotifyPropertyChanged 来通知UI。

答案 1 :(得分:0)

抱歉,但我不明白这一点。要回答您的问题,您需要提供更多信息。

  1. 是否要通过替换usercontrol来更改datacontext?
  2. 为什么不为不同的目标类型使用不同的数据模板?
  3. 也许你可以提供一些代码片段。