2017-02-02 14 views
1

У меня есть элемент управления контентом, и его шаблон содержимого изменяется с помощью триггера данных, но триггер не срабатывает. Что я делаю не так? Элемент управления данными и шаблонов данных - это «MainViewModel». Вот код, о котором идет речь:WPF Datatrigger по подзаголовку не работает

ресурсы управления содержимым:

<DataTemplate x:Key="TopologyConfigurationInputTemplate"> 
<ContentControl> 
    <ContentControl.Resources> 
     <conv:ObjectToStringConverter x:Key="ObjectToStringConverter"/> 
    </ContentControl.Resources> 
    <ContentControl.Style> 
     <Style TargetType="{x:Type ContentControl}"> 
      <Setter Property="ContentTemplate" Value="{StaticResource CraneTemplate123}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=TopologyConfigViewModel.TemplateSelection}" 
         Value="{x:Static vm:TopologyConfigViewModel+TemplateSelectionEnum.CRANE}"> 
        <Setter Property="ContentTemplate" Value="{StaticResource CraneTemplate123}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=TopologyConfigViewModel.TemplateSelection}" 
         Value="{x:Static vm:TopologyConfigViewModel+TemplateSelectionEnum.EQUIPMENT}"> 
        <Setter Property="ContentTemplate" Value="{StaticResource EquipmentTemplate123}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=TopologyConfigViewModel.TemplateSelection}" 
         Value="{x:Static vm:TopologyConfigViewModel+TemplateSelectionEnum.TERMINAL}"> 
        <Setter Property="ContentTemplate" Value="{StaticResource TerminalTemplate123}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

Content Control:

<ContentControl ContentTemplate="{StaticResource TopologyConfigurationInputTemplate}" MinHeight="250"/> 

Это мой "MainViewModel":

public class MainViewModel : BaseViewModel 
{ 
    private TopologyViewModel _topologyViewModel; 
    private TopologyConfigViewModel _topologyConfigViewModel; 
    protected Dictionary<string, List<string>> _validationErrors; 

    public MainViewModel() 
    { 
     _topologyViewModel = new TopologyViewModel(GetTopology()); 
     _topologyConfigViewModel = new TopologyConfigViewModel(_topologyViewModel); 
     _validationErrors = new Dictionary<string, List<string>>(); 
    } 

    public TopologyViewModel TopologyViewModel 
    { 
     get { return _topologyViewModel; } 
     set 
     { 
      if (_topologyViewModel != value) 
      { 
       _topologyViewModel = value; 
       NotifyPropertyChanged("TopologyViewModel"); 
      } 
     } 
    } 

    public TopologyConfigViewModel TopologyConfigViewModel 
    { 
     get { return _topologyConfigViewModel; } 
     set 
     { 
      if (_topologyConfigViewModel != value) 
      { 
       _topologyConfigViewModel = value; 
       NotifyPropertyChanged("TopologyConfigViewModel"); 
      } 
     } 
    } 
} 

Это является вложенным ViewModel «TopologyConfigViewModel», где реализуется свойство для триггера данных:

public class TopologyConfigViewModel : BaseViewModel 
{ 
    public enum TemplateSelectionEnum { CRANE, EQUIPMENT, TERMINAL } 
    private TemplateSelectionEnum _templateSelection; 
    private TopologyViewModel _topologyViewModel; 
    protected Dictionary<string, List<string>> _validationErrors; 
    private ICommand _craneConfigSelectCmd; 
    private ICommand _equipmentConfigCmd; 
    private ICommand _terminalConfigCmd; 

    public TopologyConfigViewModel(TopologyViewModel pTopologyViewModel) 
    { 
     _topologyViewModel = pTopologyViewModel; 
     _validationErrors = new Dictionary<string, List<string>>(); 
     _craneConfigSelectCmd = new DelegateCommand(param => ChangeConfigTemplate(param)); 
     _equipmentConfigCmd = new DelegateCommand(param => ChangeConfigTemplate(param)); 
     _terminalConfigCmd = new DelegateCommand(param => ChangeConfigTemplate(param)); 
    } 

    public TemplateSelectionEnum TemplateSelection 
    { 
     get { return _templateSelection; } 
     set 
     { 
      if (_templateSelection != value) 
      { 
       _templateSelection = value; 
       NotifyPropertyChanged("TemplateSelection"); 
      } 
     } 
    } 

    public ICommand CraneConfigSelectCmd 
    { 
     get { return _craneConfigSelectCmd; } 
    } 

    public ICommand EquipmentConfigSelectCmd 
    { 
     get { return _equipmentConfigCmd; } 
    } 

    public ICommand TerminalConfigSelectCmd 
    { 
     get { return _terminalConfigCmd; } 
    } 

    public void ChangeConfigTemplate(object param) 
    { 
     try 
     { 
      if (param == null) 
       return; 
      if (((string)param) == "Crane") 
       TemplateSelection = TemplateSelectionEnum.CRANE; 
      else if (((string)param) == "Equipment") 
       TemplateSelection = TemplateSelectionEnum.EQUIPMENT; 
      else 
       TemplateSelection = TemplateSelectionEnum.TERMINAL; 
      //CraneConfigSelected = true; 

     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
     } 
    } 
} 

После правильной работы: Команды для изменения значения Перечисления, свойство изменено уведомление

Спасибо заранее!

+0

Вы должны связываться с 'TopologyConfigViewModel.TemplateSelection' во всех 3-х триггеров, но делать это только в первом. – Grx70

+0

О да, ты прав, глупая ошибка. Я изменил его, но триггеры все еще не срабатывают. –

ответ

1

Он должен работать, если вы свяжете содержимого свойство ContentControl в модели представления:

<ContentControl ContentTemplate="{StaticResource TopologyConfigurationInputTemplate}" Content="{Binding}" MinHeight="250"/> 
+0

Вы правы, теперь это работает. Информационный контент управления содержимым пуст. Трудно найти ... Спасибо! –