[英]Click Event Not Firing After Changing ObservableCollection
我對WPF沒有經驗,所以請原諒我缺乏理解。
編輯:我正在研究一個簡單的國際象棋GUI,這些棋子移動很好,直到一個人試圖移動一個已被移動的棋子。 如果我們嘗試將棋子移動到之前占用的方格,則點擊事件根本不會發射。 如果我們嘗試將其移動到之前未觸及的方塊,則會觸發該事件,但UI不會更新。
這是棋盤的XAML(從這里借用: 構建國際象棋應用程序所需的WPF控件 ):
<Window x:Class="Client.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Client"
xmlns:defaults="clr-namespace:butnotquite.Defaults;assembly=butnotquite"
mc:Ignorable="d"
Title="butnotquite Chess" Height="600" Width="600">
<Window.Resources>
<DrawingBrush x:Key="Checkerboard" Stretch="None" TileMode="Tile" Viewport="0,0,2,2" ViewportUnits="Absolute">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="Tan">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,2,2" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing Brush="Brown">
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="0,0,1,1" />
<RectangleGeometry Rect="1,1,1,1" />
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
<Style x:Key="PieceStyle" TargetType="{x:Type Image}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding PieceType}" Value="{x:Static defaults:PieceType.None}"/>
<Condition Binding="{Binding Color}" Value="{x:Static defaults:Color.None}"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Image.Source" Value="/Images/empty_square.png" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding PieceType}" Value="{x:Static defaults:PieceType.Pawn}"/>
<Condition Binding="{Binding Color}" Value="{x:Static defaults:Color.White}"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Image.Source" Value="/Images/white_pawn.png" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Viewbox>
<ItemsControl Name="ChessboardUI">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="8" Height="8" Background="{StaticResource Checkerboard}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Name="square" PreviewMouseDown="square_MouseLeftButtonDown" Width="1" Height="1" >
<Image Width="0.8" Height="0.8" Style="{StaticResource PieceStyle}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Position.X}" />
<Setter Property="Canvas.Top" Value="{Binding Position.Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Viewbox>
</Window>
我已經省略了所有部分的多數據觸發器,因為它們都很相似。
這是viewmodel。 我正在使用MVVMLight庫:
public class PieceViewModel : ViewModelBase
{
private PieceType pieceType;
private Color color;
private Point position;
public PieceType PieceType
{
get
{
return this.pieceType;
}
set
{
this.pieceType = value;
base.RaisePropertyChanged(() => this.PieceType);
}
}
public Color Color
{
get
{
return this.color;
}
set
{
this.color = value;
base.RaisePropertyChanged(() => this.Color);
}
}
public Point Position
{
get
{
return this.position;
}
set
{
this.position = value;
base.RaisePropertyChanged(() => this.Position);
}
}
}
這是我填充ObservableCollection的方法:
private void BindPieces()
{
this.chessboard = new Chessboard(false);
this.pieces = new ObservableCollection<PieceViewModel>();
for (int square = 0; square < this.chessboard.Board.Length; square++)
{
int x = square % 8;
int y = square / 8;
Point position = new Point(x, y);
PieceViewModel pieceModel = new PieceViewModel()
{
PieceType = this.chessboard.Board[square].OccupiedBy.Type,
Color = this.chessboard.Board[square].OccupiedBy.Color,
Position = position
};
this.pieces.Add(pieceModel);
}
this.ChessboardUI.ItemsSource = this.pieces;
}
可在此處找到更多代碼: https : //github.com/YouJinTou/butnotquite/tree/master/Client
感謝您的幫助。
正如lokusking所評論的那樣,集合只需要實例化一次,這就是這里的情況; 然而,我沒有清除它並在每次點擊后重新綁定它。 這似乎是一個hackish解決方案,但它的工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.