WPF DataTrigger - PullRequest
       22

WPF DataTrigger

4 голосов
/ 01 ноября 2010

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

Следующий код принадлежит пользовательскому элементу управления 'House' и отлично работает на конструкторе. Я могу выбрать объект «дом» и изменить свойство HouseType в сетке свойств и увидеть желаемый эффект. Но во время выполнения, если я изменяю то же свойство, ничего не происходит!

<DrawingBrush x:Key="emptyHouseBrush">
  <DrawingBrush.Drawing>
    <GeometryDrawing Geometry="M0,0 100,100 M0,100 100,0">
      <GeometryDrawing.Pen>
        <Pen Brush="Black" />
      </GeometryDrawing.Pen>
    </GeometryDrawing>
  </DrawingBrush.Drawing>
</DrawingBrush>

<DataTemplate DataType="{x:Type m:House}">
  <Border x:Name="border" BorderThickness="2"  >
    <Grid x:Name="grid" >

    </Grid>
  </Border>      
  <DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Neutral">
      <Setter TargetName="border" Property="BorderBrush" Value="Black"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Forbidden">
      <Setter TargetName="border" Property="BorderBrush" Value="Black"/>
      <Setter TargetName="grid" Property="Background" Value="{StaticResource ResourceKey=emptyHouseBrush}"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Borders">
      <Setter TargetName="border" Property="BorderBrush" Value="#FF7A6D34"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Homeland">
      <Setter TargetName="border" Property="BorderBrush" Value="#FFFFD200"/>
      <Setter TargetName="border" Property="Background" Value="#54FBE681"/>
    </DataTrigger>

    <Trigger SourceName="border" Property="IsMouseOver" Value="True">
      <Setter TargetName="border" Property="Background" Value="#645CAEF9"/>
    </Trigger>

  </DataTemplate.Triggers>
</DataTemplate>


</Control.Resources>
  <ContentControl>
    <m:House x:Name="house" HouseType="Neutral"></m:House>
  </ContentControl>

</UserControl>

Я попытался использовать свойства по умолчанию, свойства зависимостей, реализовать интерфейс IPropertyChanged, попытался переместить свойство в элемент управления и повторить все вышеперечисленное ... и все равно ничего.

Чего мне не хватает? Как заставить элемент управления обновлять границу (и фон) после изменения этого свойства?

Заранее спасибо.

Марсело

Ответы [ 3 ]

1 голос
/ 05 декабря 2010

Код кажется мне хорошим.Хороший способ отследить эти ошибки - небольшая программа, которую я нахожу действительно замечательной: Snoop.

http://snoopwpf.codeplex.com/Thread/View.aspx?ThreadId=207711

Просто взгляните на нее, и, возможно, вы сможетеотследить свою ошибку.

{наслаждайтесь}

1 голос
/ 05 декабря 2010

Кажется, вы путаете ControlTemplates с DataTemplates. DataTemplate используется для указания способа отображения определенного типа объекта данных; обычно он содержит несколько элементов управления, связанных со свойствами значений объекта. Вам нужно изменить визуализацию элемента управления по умолчанию, лучше всего это сделать с помощью ControlTemplate. Если вы хотите сохранить визуализацию элемента управления и просто добавить изменение цвета границы, вы можете использовать инструмент, такой как Blend, чтобы получить текущий ControlTemplate элемента управления House и настроить его, добавив триггеры

0 голосов
/ 04 декабря 2010

Это выглядит хорошо для меня. Убедитесь, что объект House реализует INotifyPropertyChanged и что вы вызываете PropertyChanged при обновлении свойства. Если это все еще не работает, посмотрите на свое окно Отладки вывода. Ошибки привязки обычно появляются там.

...