2009-11-25 2 views
9

У меня есть datatemplate, содержащий изображение, которое я хочу скрывать, если значение свойства в ViewModel истинно. Может ли кто-нибудь сказать мне, почему приведенный ниже xaml не работает?WPF Запуск связывания с свойством MVVM

<Image x:Name="img" Source="..\Images\List_16.png" Margin="0,0,5,0"> 
    <Image.Style> 
    <Style> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding CurrentListHasPendingChanges}" Value="True"> 
      <Setter Property="Image.Visibility" Value="Hidden" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding CurrentListHasPendingChanges}" Value="False"> 
      <Setter Property="Image.Visibility" Value="Visible" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Image.Style> 
</Image> 

ответ

3

не то, что

<Setter Property="Visibility" Value="Hidden" /> 

?

Предполагаю, что вы используете INotifyProptyChanged.

EDIT Я сделал несколько Google и считаю, что вам нужно использовать какой-то шаблон, чтобы заставить триггер работать.

например .: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ae2dbfb7-5dd6-4352-bfa1-53634289329d

http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx

+0

Да Я реализую INotifyPropertyChanged. Когда я меняю установщик, как указано выше, я получаю следующую ошибку компиляции: Не удается разрешить свойство стиля «Видимость». Убедитесь, что тип владельца является целевым типом стиля или использует синтаксис Class.Property для указания свойства –

+0

. Спасибо за это, я скоро их просмотрю. –

6

Попробуйте удалить "Image" часть от собственности = "Image.Visibility", так что вы будете иметь:

<Setter Property="Visibility" Value="Hidden"/> 

и добавить TargetType к вашему стилю :

<Style TargetType="{x:Type Image}"> 
4

Я просто что-то сделал lar с помощью ContentControl.

<ContentControl Content="{Binding CurrentListHasPendingChanges}"> 
    <ContentControl.ContentTemplate> 
    <DataTemplate> 
     <Image x:Name="img" Source="..\Images\List_16.png" Margin="0,0,5,0" Visibility="Hidden" /> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding}" Value="False"> 
      <Setter Property="Image.Visibility" Value="Visible" /> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

От http://karlhulme.wordpress.com/2007/03/06/using-a-contentcontrol-and-datatemplate-to-indicate-new-andor-modified-data/

2

На мой взгляд, мы не должны использовать триггеры, с только Binding он работает хорошо. Для привязки к модели собственности, вы можете использовать BooleanToVisibilityConverter Объявлена ​​следующим образом:

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
</UserControl.Resources> 

И как использовать это просто, просто указать на ключ указанный выше:

<Image HorizontalAlignment="Left" Height="16" VerticalAlignment="Center" Width="16" 
     Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}" 
     Source="/myPath;component/Resources/Images/image1.png"/> 

свойство в ViewModel:

private bool _hasError = false; 
    public bool HasError 
    { 
     get { return !string.IsNullOrEmpty(_messageError); } 
     set 
     { 
      _hasError = value;     
      this.NotifyOfPropertyChange(() => this.HasError); 
     } 
    } 
Смежные вопросы