2017-01-26 2 views
0

J'ai un modèle de vue lié à mon DataContext TabItem. Et il montre tous les UIContols contenus dans ce dockpanel (disons que le nom du dockpanel est DoockpanelWithdata). Ce que je veux faire est, quand j'ai la valeur de l'objet Viewmodel égale à null alors je veux montrer autre Dockpanel disant qu'il n'y a pas de données (disons DoockpanelWithOutData).Comment faire pour basculer dockpanels sur objet lié est null et non null, UpdateSourceTrigger ne fonctionne pas je suppose

Mon essai est la suivante:

Comment changer ces dockpanels lorsque VM == null et non null?

<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> 

En voir le modèle (UR1R2_VM.cs) i ont:

private ObservableCollection<UModel> uObj; //binded to itemsource of another TabItem 
public ObservableCollection<UModel> UObj 
     { 
      get { return uObj; } 
      set { uObj= value; OnPropertyChanged("UObj"); } 
     } 
     private UModel selectedItem; //Binded to listView selecteditem of another tabitem   
    public UModel SelectedItem //HERE INSTANCE IS CREATED 
    { 
     get { return selectedItem; } 
     set 
     { 
      selectedItem = value; 
      GM = selectedItem != null ? new GM(selectedItem.Nom) : null; //HERE INSTANCE IS CREATED 
      OnPropertyChanged("SelectedItem");     
     } 
    }  


    private GM gM; 
    public GM GM 
    { 
     get { return gM; } 
     set 
     { 
      gM = value; 
      OnPropertyChanged("GM"); 
     } 
    } 
+0

Le code que vous avez fonctionne très bien pour moi, mais assurez-vous cependant de définir le DataContext du contenu de 'DockPanelWithData'? DataContext par défaut sera votre 'UR1R2_VM', et non votre objet' Graph_VM'. Sinon, pouvez-vous mettre un point d'arrêt où vous définissez GraphVM pour vous assurer qu'il est défini sur la valeur attendue? – Rachel

+0

Je ne sais pas si vous avez remarqué que dans mon premier tabitem j'ai lié l'élément sélectionné listview à la propriété Selecteditem dans mon viewmodel UR1R2_VM. Lequel lors de la sélection d'une ligne instancie l'objet GraphVM. Le second ab qui contient à la fois le dockpanel est défini sur datacontext de la classe GraphVM. –

Répondre

0

Ici, vous allez ..

Assurez-vous que votre propriété GraphVM appelle RaisePropertyChanged chaque fois qu'il a changé (c.-à- est mis à null). Ceci est important pour que le déclencheur soit réglé.

<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> 
+0

Je me sens comme UpdateSourceTrigger = PropertyChanged ne fonctionne pas. Il montre toujours DoockpanelWithOutData dans le cas où GraphVM est initialisé et non initialisé, dans les deux cas. –

+0

Soit votre DataContext est incorrect, soit votre propriété VM n'est pas configurée correctement. Besoin de plus de code? Publiez votre propriété VM et VM appropriée –

+0

J'ai mis à jour le code s'il vous plaît voir –