我正在开发一款棋盘游戏来控制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接口、尝试将属性移动到控件并重复上述所有操作……还是一无所获。
我遗漏了什么?更改此属性后,如何让控件更新边框(和背景)?
提前谢谢。
马塞洛
发布于 2010-12-05 12:09:12
代码对我来说似乎很好。我发现一个很棒的小程序: Snoop,这是一个寻找这些错误的好方法。
http://snoopwpf.codeplex.com/Thread/View.aspx?ThreadId=207711
只要看一眼,也许你就能追查到你的错误。
{尽情享受}
发布于 2010-12-05 16:41:42
看起来你把ControlTemplates和DataTemplates搞混了。DataTemplate用于指定某个数据对象类型的显示方式,它通常包含一些绑定到对象的值属性的控件。您想要的是更改控件的默认可视化,这最好使用ControlTemplate来完成。如果您想保持控件的可视化,而只是添加边框颜色更改,那么您可以使用诸如Blend之类的工具来获取房屋控件的当前ControlTemplate并对其进行自定义,添加触发器
发布于 2010-12-04 09:11:48
我觉得挺不错的。确保House对象实现了INotifyPropertyChanged,并且在更新属性时调用了PropertyChanged。如果它仍然不工作,请查看输出调试窗口。绑定错误通常会出现在那里。
https://stackoverflow.com/questions/4066895
复制相似问题