如果我只提供一些有限的活动,我该如何实施Changed事件?

时间:2014-08-31 08:17:20

标签: c# wpf

我知道下面的代码设计太糟糕了,但我必须在某些供应商发明的有限框架上实现该事件。

我正在处理 控件 例如 UserControl ,其中包含许多 TextBox 控件。

UserControl就像供应商提供的Excel一样。

此控件具有以下事件

  

“CellBeginEdit” ...当您集中控件时,它会触发。

     

“CellEditEnded” ...当您关注其他控件时,它会触发。

     

“CellEditEnding” ...当您关注其他控件时,它会触发。

     

“CellEnter” ...当您将细胞聚焦在控件中时,它会触发。

     

“CellLeave” ...当您将其他单元格聚焦到控件中时,它会触发。

这是在 单元格 中编辑 文字 的所有事件。

但是我需要在所有单元格中实施 TextChanged 事件。

这是我的代码。

    private void CellBeginEdit(object sender, CellBeginEditEventArgs e)
    {
        //Get the element before Editing 
        Cell cell = currentCell;        

        //Not show. it requires to fire TextChanged event when textBox.Text = "something"; 
        TextBox textBox = new TextBox();
        textBox.Text = cell.Text;

        textBox.TextChanged += (s, ev) => MessageBox.Show("Done!");

        cell.Text = "Another Value";

        //I wish This code emerges "Done!" on Message Box.
    }

我试过,但效果不好。

我已经知道 string 就好像原始类型在那种情况下做的那样和C#,

所以我将以上内容重写为以下内容。

    public TextBox textBox = new TextBox();
    private void changeData(ref string data)
    {
        textBox.Text = data;
    }

    private void CellBeginEdit(object sender, CellBeginEditEventArgs e)
    {
        Cell cell = currentCell;

        changeData(ref cell.Text);

        textBox.TextChanged += (s, ev) => MessageBox.Show("hoge");

        cell.Text = "Another Value";
    }

但是这些代码会导致编译错误。

它说我无法在属性中使用ref关键字。

为什么我不能将ref放在这里?我该如何实施活动?

修改

谢谢!我完全解决了。 这是代码。

        new Thread(
            delegate() {
                while (true)
                {
                    for (int i = 0; i < sheet.RowCount; i++)
                    {
                        if (sheet.Cells[i, 4].Text != "Before Value")
                        {
                            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                                new Action(
                                    () =>
                                      sheet.Cells[i, 5].Background = Brushes.Azure
                                )
                            );
                        }
                    }
                    Thread.Sleep(100);
                }
            }
        ).Start();

1 个答案:

答案 0 :(得分:2)

这不起作用,因为字符串是不可变的。

你的问题并不在于你没有得到对字符串的引用,因为你已经这样做了。问题是字符串永远不会改变。当单元格中的文本发生更改时,它不会更改包含文本的字符串,它将创建一个包含已更改文本的新字符串,并使用该字符串。

我看到为控件创建TextChanged事件的可能方式是使用反射来入侵类的私有成员,或使用计时器定期检查Text控件的属性,看它是否已经改变。