2017-01-26 14 views
0

У меня есть модель представления, привязанная к элементу DataItem TabItem. И он показывает все UIContols, содержащиеся в этой док-панели (скажем, имя докпандера - DoockpanelWithdata). Что я хочу сделать, когда у меня есть значение объекта Viewmodel равным нулю, тогда я хочу показать другую док-панель, говорящую, что данных нет (скажем, DoockpanelWithOutData).Как переключить док-панели на привязанный объект, является нулевым, а не null, UpdateSourceTrigger не работает, я думаю

Моя попытка это:

Как переключить эти dockpanels, когда VM == NULL и NOT 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> 

В Модельное (UR1R2_VM.cs) у меня есть:

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

Код, который у вас есть, отлично подходит для меня, однако вы уверены, что установите DataContext для содержимого для DockPanelWithData? По умолчанию DataContext будет вашим 'UR1R2_VM', а не вашим объектом' Graph_VM'. Кроме этого, можете ли вы установить точку останова, где вы устанавливаете GraphVM, чтобы убедиться, что он установлен на ожидаемое значение? – Rachel

+0

Я не знаю, заметили ли вы, что в моем первом tabitem я привязал listview выбранный элемент к свойству Selecteditem в моей модели просмотра UR1R2_VM. Что при выборе строки создает экземпляр объекта GraphVM. Второй элемент ab, который содержит обе док-панели, установлен в datacontext класса GraphVM. –

ответ

0

Здесь вы идете ..

Просто убедитесь, что ваш GraphVM свойство вызова RaisePropertyChanged всякий раз, когда он изменился (т.е. получает значение null). Это важно для того, чтобы триггер был установлен.

<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

Мне кажется, что UpdateSourceTrigger = PropertyChanged не работает. Он по-прежнему показывает DoockpanelWithOutData как в случае, когда GraphVM является intialized, а не intialized, в обоих случаях. –

+0

Либо ваш DataContext ошибочен, либо свойство вашей виртуальной машины настроено неправильно. Нужен больше кода? Отправьте свои соответствующие свойства VM и VM –

+0

Я обновил код, пожалуйста, см. –