【问题标题】:Can read my class inside the mouse click event but can't modify it, why?可以在鼠标单击事件中读取我的类但不能修改它,为什么?
【发布时间】:2015-01-10 09:13:49
【问题描述】:

我有一些问题,我只能在我的 Mainwindow() 方法中更新我的 gui。并且无法真正弄清楚为什么它不能在事件中更改 gui。我也使用绑定和视图模型类。

所以当我走出主窗口时,我的绑定似乎停止工作?

有什么想法可能是错的吗?

谢谢!

public partial class MainWindow : Window
{


    public ObservableCollection<ChessPiece> ItemX { get; set; }

    public MainWindow()
    {
       ItemX = new ObservableCollection<Chess>();

       InitializeComponent();
       DataContext = ItemX ;
       ItemX.Add(new Chess() { PosX = 0, PosY = 0, Type_ = Piece.Farmer, Player_ = PiecePlayer.Black });
       ItemX.Add(new Chess() { PosX = 0, PosY = 1, Type_ = Piece.Farmer, Player_ = Player.Black });


  ItemX.ElementAt(1).PosX = 5; //This works perfect, my GUI changes! 
}      

 public void ChessBoardClick(object sender, MouseButtonEventArgs e)
    {
       ItemX.ElementAt(0).PosX = 3; //Wont work, but the values inside ItemX changes. 


    }

【问题讨论】:

  • 你说我的GUI改变了,但是GUI在哪里呢?它与什么有关? Chess 类是否正确实现了INotifyPropertyChanged

标签: c# wpf user-interface binding


【解决方案1】:

目前,您的 GUI 没有改变开始正确...您没有 MainWindow 方法,您有 MainWindow构造函数。 UI 只会在该构造函数完成后完成更新,此时 PosX 将是 5。

为了让您的 UI 对属性更改做出反应,您的 Chess 类需要实现 INotifyPropertyChanged,以便在您更改 PosX 属性时触发事件。

作为旁注,使用集合的索引器比使用 ElementAt 方法更惯用,例如

ItemX[0].PosX = 3;

【讨论】:

  • 非常感谢,精彩的回答!我实际上在我的国际象棋课中添加了 INotiftyProbertyChange 并假设它是始终在更新我的 ui 的 propertychange,而不是构造函数,所以我认为它正在工作。现在再次检查并注意到我有一些拼写错误,它现在可以工作了!所以再次感谢! :) 还要感谢您纠正我的错误假设以及 ItemX[0]!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多