簡體   English   中英

更改ObservableCollection后單擊“事件未觸發”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM