2016-04-22 3 views
1

У меня есть настраиваемая подсказка, которую я пытаюсь создать. У меня есть следующее:Видимость в зависимости от значения привязки

<UserControl.ToolTip> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock> 
     <TextBlock Text="{Binding Path=ToolPrototype.Description}" MaxWidth="200" TextWrapping="Wrap"></TextBlock> 
     <TextBlock Text="{Binding Path=ToolPrototype.Note}" MaxWidth="200" FontWeight="Regular" FontStyle="Italic" TextWrapping="Wrap"></TextBlock> 
    </StackPanel> 
</UserControl.ToolTip> 

Это довольно прямолинейно. Заголовок будет выделен жирным шрифтом. Описание будет регулярным шрифтом шрифта, а «примечание» будет выделено курсивом. Проблема в том, что не все мои ToolPrototypes имеют .Note как член (это в основном null). Некоторые из моих инструментов включают строковое значение, которое присваивается свойству Note, но не все. Итак, в тех случаях, когда примечание равно null, я все еще получаю пустую область в своей всплывающей подсказке (по сути, это как пустая строка). То, что я хотел бы сделать, это включить только эту строку, если на ToolPrototype на самом деле определено свойство заметки. В противном случае опустите его. Итак, то, что я думаю, что мне нужно, пытается условно проверить, существует ли привязка ... но, возможно, это неправильный способ подумать об этом. Может ли кто-нибудь дать некоторые рекомендации?

Update

Отработка предложения Ash, я пытаюсь работать с DataTriggers. Вот что у меня есть сейчас.

<UserControl.ToolTip> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock> 
     <TextBlock Text="{Binding Path=ToolPrototype.Description}" MaxWidth="200" TextWrapping="Wrap"></TextBlock> 
     <TextBlock MaxWidth="200" Text="{Binding Path=ToolPrototype.Note}" FontWeight="Regular" FontStyle="Italic" TextWrapping="Wrap"> 
      <TextBlock.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=ToolPrototype.Note}" Value="{x:Null}"> 
          <Setter Property="Visibility" Value="Collapsed"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
    </StackPanel> 
</UserControl.ToolTip> 

Однако это не строится и говорит, что элемент «Видимость» не распознается. Может ли кто-нибудь указать на мою ошибку?

+2

@ASh является правильным. Если это много, вы также можете написать «NullToVisibilityConverter», чтобы сохранить беспорядок в XAML: «' –

+0

I 'd пойти триггерный путь, как предложил А.Ш. привыкнуть к тому, что избавляет вас от внедрения конвертера абсолютно для всех (помните, что иногда конвертер по-прежнему будет лучшим решением в зависимости от сложности вашего сценария) – Dbl

+0

Спасибо, ASh! Однако я что-то пропустил в предоставленной ссылке? Кажется, я не вижу никаких ответов с триггерами данных в них. – andyopayne

ответ

1

Ваш Style не связан с типом TextBlock.

Следовательно, WPF не знает о собственности Visibility. (Потому что это свойство определено в TextBlock)

Вы можете явно указать WPF, класс которого определяет свойство, изменив его на TextBlock.Visibility. Позвольте мне показать пример:

<UserControl.ToolTip> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock> 
     <TextBlock Text="{Binding Path=ToolPrototype.Description}" MaxWidth="200" TextWrapping="Wrap"></TextBlock> 
     <TextBlock MaxWidth="200" Text="{Binding Path=ToolPrototype.Note}" FontWeight="Regular" FontStyle="Italic" TextWrapping="Wrap"> 
      <TextBlock.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=ToolPrototype.Note}" Value="{x:Null}"> 
          <Setter Property="TextBlock.Visibility" Value="Collapsed"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
    </StackPanel> 
</UserControl.ToolTip> 
+0

Спасибо. Неверная ошибка. – andyopayne

Смежные вопросы