WPF ComboBox - показывает что-то другое, когда никакие элементы не связаны - PullRequest
2 голосов
/ 20 мая 2009

У меня есть ComboBox, и я хочу изменить его внешний вид, когда свойство ItemsSource равно нулю. Когда он находится в этом состоянии, я хочу показать TextPanel с текстом «Извлечение данных» и придать ему вид, похожий на текстовое поле с водяными знаками.

Я полагаю, что для этого мне нужен ControlTemplate и триггер. У меня есть ControlTemplate здесь:

<ControlTemplate x:Key="LoadingComboTemplate" TargetType="{x:Type ComboBox}">  
    <Grid>  
        <TextBlock x:Name="textBlock" Opacity="0.345" Text="Retrieving data..." Visibility="Hidden" />  
    </Grid>  
    <!--  
    <ControlTemplate.Triggers>  
        <Trigger Property="ComboBox.ItemsSource" Value="0">  
            <Setter Property="Visibility" Value="Visible" />  
        </Trigger>  
    </ControlTemplate.Triggers>  
    -->  
</ControlTemplate>  

но моя проблема в том, как настроить триггер, чтобы показать это, когда свойство ItemsSource имеет значение null? Я пробовал несколько разных способов, и каждый из них выдавал мне сообщение об ошибке «Значение« ItemsSource »не может быть присвоено свойству« Property ». Недопустимое значение PropertyDescriptor». Мой ComboBox xaml (включая попытку запуска):

<ComboBox Margin="112,35,80,0"   
      Name="MyComboBox"   
      Height="22.723"   
      VerticalAlignment="Top"   
      DisplayMemberPath="FriendlyName"   
      SelectedValuePath="Path"   
      TabIndex="160"   
      >  
    <Trigger>  
        <Condition Property="ItemsSource" Value="0" />  
        <Setter Property="Template" Value="{StaticResource LoadingComboTemplate}" />  
    </Trigger>    
</ComboBox>  

теперь должен ли триггер идти на ComboBox или на ControlTemplate? Как мне получить доступ к свойству ItemsSource ComboBox? Должен ли я даже использовать триггер?

Спасибо!

1 Ответ

4 голосов
/ 20 мая 2009

Попробуйте ввести {x:Null} в качестве значения условия вместо 0.

Кроме того, я получил его, переместив триггер в стиль и слегка изменив его, см. Ниже.

<Style TargetType="ComboBox" x:Key="LoadingComboStyle">
    <Style.Triggers>
        <Trigger Property="ItemsSource" Value="{x:Null}">
            <Setter Property="Template" Value="{StaticResource LoadingComboTemplate}" />
        </Trigger>
    </Style.Triggers>
</Style>

<ComboBox Style="{StaticResource LoadingComboStyle}" .... >

Причина, по которой он работает только в стиле, заключается в том, что только EventTriggers разрешены в коллекции триггеров непосредственно в элементе Framework. Для триггеров свойств (как выше) вам нужно использовать стиль (я учусь чему-то каждый день).

См. FrameworkElement.Triggers

Обратите внимание, что набор триггеров, установленных для элемента, поддерживает только EventTrigger, но не триггеры свойств (Trigger). Если вам требуются триггеры свойств, вы должны поместить их в стиль или шаблон, а затем назначить этот стиль или шаблон элементу либо напрямую через свойство Style, либо косвенно через неявную ссылку на стиль.

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