繁体   English   中英

二维 int 数组自定义依赖属性绑定不起作用

[英]Two dimension int array custom dependencyProperty binding not working

绑定源

    private int[,] _map = new int[22, 12] 
    {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
    };
    public int[,] Map
    {
        get => _map;
        set => SetProperty(ref _map, value);
    }

依赖属性

public static readonly DependencyProperty MapArrayProperty =
        DependencyProperty.Register
        (
            "MapArray",
            typeof(int[,]),
            typeof(MapControl),
            new PropertyMetadata
            (
                null,
                new PropertyChangedCallback(MapArrayChanged)
            )
        );

    private static void MapArrayChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MapControl map = (MapControl)d;
        map.MapChanged();
    }

    public int[,] MapArray
    {
        get
        {
            return (int[,])GetValue(MapArrayProperty);
        }
        set
        {
            SetValue(MapArrayProperty, value);
        }
    }

    private void MapChanged()
    {
        for(int i = 0; i<MapArray.GetLength(0); i++)
        {
            for(int j = 0; j<MapArray.GetLength(1); j++)
            {
                Grid grid = new Grid();
                grid.Background = ColorSeletor(MapArray[i, j]);
                Grid.SetRow(grid, i);
                Grid.SetColumn(grid, j);
                GridMap.Children.Add(grid);
            }
        }
    }

开始按钮绑定源码

    public ICommand StartCommand
    {
        get;
        set;
    }
    private void RandomBlockSelector()
    {
        IDefaultBlock defaultBlock = null;
        Random r = new Random();
        int selectedblock = r.Next(2, 9);
        switch (selectedblock)
        {
            case 2:
                defaultBlock = new IBlock();
                break;
            case 3:
                defaultBlock = new JBlock();
                break;
            case 4:
                defaultBlock = new LBlock();
                break;
            case 5:
                defaultBlock = new OBlock();
                break;
            case 6:
                defaultBlock = new SBlock();
                break;
            case 7:
                defaultBlock = new TBlock();
                break;
            case 8:
                defaultBlock = new ZBlock();
                break;
        }
        InsertBlock(defaultBlock.BlockArray);
    }

    private void InsertBlock(int[,] blockShape)
    {
        for(int i = 4; i<8; i++)
        {
            for(int j = 1; j<5; j++)
            {
                Map[i, j] = blockShape[i - 4, j - 1];
            }
        }
    }

    private void Start()
    {
        RandomBlockSelector();
    }

如果我启动应用程序,绑定工作

第一个启动画面

但是如果我单击按钮,绑定不起作用我认为当我单击按钮修改数组时,必须修改数组,并且必须发生属性更改事件才能更改视图

如果有另一种绑定二维数组的方法,请告诉我,或者您能在我的代码中找到错误吗? 我想要点击后的图片按钮点击

这是单击按钮后应显示在视图中的内容(如果有效)

首先是免责声明:

WPF、Windows 窗体和其他桌面应用程序格式不是游戏开发的正确工具。 正确的工具是任何带有 游戏循环的东西。 XNA 有点过时,但有一个完整的当前可能的前端列表。

问题是,如果集合值更改,您的集合没有更改通知。 您需要的是 ObservableCollection 或其他“为 WPF 制作”的集合。 ObservableCollection<int>[] - ObservableCollection 实例的数组 - 可能是您正在寻找的机器人。 但是ObservableCollection<ObservableCollection<int>>可能是更好的选择(您可能希望使用别名来保持这些类型的可读性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM