WPF数据触发器

4
我正在开发一个桌游来熟悉WPF技术,但经过整整一晚的尝试,我卡在了这个部分。
下面的代码属于“House”用户控件,在设计器中可以正常工作。我可以选择“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接口,尝试将属性移动到控件并重复上述步骤......但仍然没有效果。

我错过了什么?如何在更改此属性后使控件更新边框(和背景)?

谢谢您的帮助。

Marcelo

3个回答

1

1

看起来你把ControlTemplates和DataTemplates混淆了。 DataTemplate用于指定如何显示某个数据对象类型,通常包含一些绑定到对象值属性的控件。你想要的是更改控件的默认可视化,最好使用ControlTemplate。如果你只想保留控件的可视化并添加边框颜色更改,则可以使用诸如Blend之类的工具获取House控件的当前ControlTemplate并自定义它添加你的触发器。


0

我觉得看起来不错。确保House对象实现了INotifyPropertyChanged接口,并在更新属性时调用PropertyChanged方法。如果仍然无法正常工作,请查看输出调试窗口。绑定错误通常会在那里显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接