DataTrigger, привязка к вложенным свойствам через TemplatedParent - PullRequest
1 голос
/ 12 апреля 2011

Согласно msdn , должно быть совершенно законно и возможно связать что-либо с вложенным свойством:

<Binding Path="propertyName.propertyName2" .../>
<Binding Path="propertyName.propertyName2.propertyName3" .../>

В моем случае это не так, хотя ...

У меня есть пользовательский элемент управления MyControl со свойством зависимости ViewModel:

    public static DependencyProperty ViewModelProperty = DependencyProperty.Register(
        "ViewModel", typeof(IViewModel), typeof(MyControl));

    public IViewModel ViewModel
    {
        get { return (IViewModel)GetValue(ViewModelProperty); }
        set { SetValue(ViewModelProperty, value); }
    }

, и в шаблоне элемента управления я пытаюсь привязать свойства в этой модели представления:

 <Style TargetType="{x:Type my:MyControl}">
   <Setter Property="Template">
     <Setter.Value>
       <ControlTemplate TargetType="{x:Type my:MyControl}">
         <Grid>
           <TextBox Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Text}"/>
           <Button x:Name="MyButton" Content="Visible by trigger" Visibility="Collapsed" />
         </Grid>
       <ControlTemplate.Triggers>
         <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.ButtonVisible}" Value="True">
           <Setter TargetName="MyButton" Property="Visibility" Value="Visible" />
         </DataTrigger>            
      .../>

В самой модели представления у меня есть текст preoperty следующим образом:

    public string Text
    {
        get { return m_text; }
        set
        {
            m_text = value;
            OnPropertyChanged("Text");
        }
    }

    public bool ButtonVisible
    {
      get { return m_buttonVisible; }
      set 
     { 
       m_buttonVisible = value; 
       OnPropertyChanged("ButtonVisible"); }
     }

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

Есть какие-нибудь подсказки?

Редактировать Похоже, что привязки работают наполовину.Когда текст изменяется в окне редактирования, устанавливается мое свойство Text, но если свойство Text установлено в коде, пользовательский интерфейс не будет обновляться.

Редактировать 2
Похоже, моя первая попытка упростить кейс до публикации была немного успешной ... Как указывает @Erno, опубликованный мною код работаетХОРОШО.

Я еще немного посмотрел на исходный код и добавил триггер к сценарию.Оригинальный код использует триггеры для отображения частей пользовательского интерфейса при заданных условиях.Они также привязаны к вложенным свойствам.Теперь я думаю, что эти триггеры не срабатывают.Я обновил код.Если это все еще не показывает, что не так, я могу опубликовать пример приложения где.

1 Ответ

4 голосов
/ 12 апреля 2011

Отсутствует запятая:

<TextBox Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Text}"/>

EDIT

Добавить режим = TwoWay к привязке:

<TextBox Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Text, Mode=TwoWay}"/>

EDIT2

Понял! Я мог бы воспроизвести и исправить это.

Замените TemplatedParent на Self в привязке. Прочитайте это объяснение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...