Wpf 如何在绑定对象上切换DockPanel为null且不为null,我想UpdateSourceTrigger不起作用

Wpf 如何在绑定对象上切换DockPanel为null且不为null,我想UpdateSourceTrigger不起作用,wpf,mvvm,binding,datacontext,tabitem,Wpf,Mvvm,Binding,Datacontext,Tabitem,我有一个绑定到TabItem DataContext的视图模型。它显示了dockpanel中包含的所有UIControl(假设dockpanel的名称是DoockpanelWithdata)。 我想做的是,当Viewmodel对象的值等于null时,我想显示其他Dockpanel,表示没有数据(比如DoockPanel Without data) 我的尝试是: 当VM==null和notnull时,如何切换这些dockpanel <TabControl> &

我有一个绑定到TabItem DataContext的视图模型。它显示了dockpanel中包含的所有UIControl(假设dockpanel的名称是DoockpanelWithdata)。 我想做的是,当Viewmodel对象的值等于null时,我想显示其他Dockpanel,表示没有数据(比如DoockPanel Without data)

我的尝试是:

当VM==null和notnull时,如何切换这些dockpanel

 <TabControl>
            <TabItem Name="Tab1" Cursor="Hand">                   
                <ListView Name="lZ" ItemsSource="{Binding UObj}" SelectedItem="{Binding SelectedItem ,Mode=TwoWay}"  >//On selected item i bind the the tabitem below which show different dockpanels on GM=null and not null 
              //columns here
                </ListView>
            </TabItem>
            <TabItem Name="TabGraph"  DataContext="{Binding GM , UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Cursor="Hand">                  
                <DockPanel Name="DoockpanelWithOutData">
                    <DockPanel.Style>
                        <Style TargetType="DockPanel">
                            <Setter Property="Visibility" Value="Collapsed" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding GM, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
                                    <Setter Property="Visibility" Value="Visible" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DockPanel.Style>
                    <TextBlock>There IS NO DATA</TextBlock>
                </DockPanel>
                <DockPanel  Name="DoockpanelWithdata">
                    <DockPanel.Style>
                        <Style TargetType="DockPanel">
                            <Setter Property="Visibility" Value="Visible" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding GraphVM, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
                                    <Setter Property="Visibility" Value="Collapsed" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DockPanel.Style>
                    //Some more data
                </DockPanel>
            </TabItem>
        </TabControl>

//在所选项目上,我将标签绑定到下面的tabitem,它在GM=null和notnull上显示不同的dockPanel
//这里的栏目
没有数据
//更多数据
在视图模型(UR1R2_VM.cs)中,我有:

私有可观测采集uObj//绑定到另一个TabItem的itemsource
公共可观测收集UObj
{
获取{return uObj;}
设置{uObj=value;OnPropertyChanged(“uObj”);}
}
私有UModel selectedItem//绑定到另一个选项卡项的listView selecteditem
public UModel SelectedItem//此处创建实例
{
获取{return selectedItem;}
设置
{
选择editem=值;
GM=selectedItem!=null?新建GM(selectedItem.Nom):null;//此处创建实例
OnPropertyChanged(“SelectedItem”);
}
}     
私人总经理;
公共总经理
{
获取{return gM;}
设置
{
gM=价值;
不动产变更(“GM”);
}
}
给你

只要确保您的
GraphVM
属性在发生更改时(即设置为null)正在调用
RaisePropertyChanged
。这对于设置触发器很重要

<DockPanel Name="DoockpanelWithOutData">
  <DockPanel.Style>
    <Style TargetType="DockPanel">
      <Setter Property="Visibility" Value="Collapsed" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding DataContext, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </DockPanel.Style>
  <TextBlock>There IS NO DATA</TextBlock>
</DockPanel>
<DockPanel  Name="DoockpanelWithdata">  
  <DockPanel.Style>
    <Style TargetType="DockPanel">
      <Setter Property="Visibility" Value="Visible" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding DataContext, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </DockPanel.Style>   
  //Some more data
</DockPanel>

没有数据
//更多数据

我觉得UpdateSourceTrigger=PropertyChanged不起作用。当GraphVM初始化和未初始化时,在这两种情况下,它仍然显示DoockPanelWithout数据。要么是DataContext错误,要么是VM属性设置不正确。需要更多的代码吗?发布相关VM和VM属性请查看我绑定SelectedItem的列表视图,因为我在lsitview的SelectedItem上实例化了GraphVM。我看到了问题所在。DataContext设置错误。。由于DockPanel位于TabControl内部,因此需要基于外部DataContext进行触发。查看更新我不知道您是否注意到,在我的第一个选项卡项中,我已将listview selected项绑定到我的UR1R2\u VM viewmodel中的Selecteditem属性。它在选择一行时实例化GraphVM对象。第二个ab包含两个dockpanel,它被设置为GraphVM类的datacontext。您的代码对我来说很好,但是您是否确保为
DockPanelWithData
设置内容的datacontext?默认数据上下文将是您的
UR1R2\u VM
,而不是您的
Graph\u VM
对象。除此之外,您是否可以在设置GraphVM的位置设置断点,以确保它被设置为预期值?我不知道您是否注意到,在我的第一个选项卡项中,我已将listview selected项绑定到UR1R2\u VM viewmodel中的Selecteditem属性。它在选择一行时实例化GraphVM对象。第二个ab包含dockpanel和GraphVM类的datacontext。
<DockPanel Name="DoockpanelWithOutData">
  <DockPanel.Style>
    <Style TargetType="DockPanel">
      <Setter Property="Visibility" Value="Collapsed" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding DataContext, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </DockPanel.Style>
  <TextBlock>There IS NO DATA</TextBlock>
</DockPanel>
<DockPanel  Name="DoockpanelWithdata">  
  <DockPanel.Style>
    <Style TargetType="DockPanel">
      <Setter Property="Visibility" Value="Visible" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding DataContext, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </DockPanel.Style>   
  //Some more data
</DockPanel>