DataGrid中的数组内部数组未更新

时间:2012-05-23 09:43:44

标签: c# .net wpf wpfdatagrid

我有一个对象集合,在对象内部会有一些属性和一个动态的对象列表。我是我的例子,这是用名称和数字属性说明的。

现在我让它看起来正确,但我在修改代码背后的数据时遇到了问题。 如果我在MainWindow()中的mList中更改了某些东西,它正确地显示在我的DataGrid上,但如果我在Click中做同样的事情,即使没有任何反应。

我看过INotifyPropertyChanged,但没有改变。

请注意,这不是我为此问题创建的示例项目

MyList.cs

public class MyObject : IEnumerable<object[]>
{
    public string Name { get; set; }
    public int[] Numbers { get; set; }

    public IEnumerator<object[]> GetEnumerator()
    {
        var obj = new object[Numbers.Length + 1];
        obj[0] = Name;
        for (var i = 0; i < Numbers.Length; i++)
            obj[i + 1] = Numbers[i];

        yield return obj;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

MainWindow.xaml.cs

private List<MyObject> mList;
    public MainWindow()
    {
        InitializeComponent();

        mList = new List<MyObject>
                    {
                        new MyObject {Name = "List 1", Numbers = new[] {1, 2, 3, 4}},
                        new MyObject {Name = "List 2", Numbers = new[] {1, 2, 3, 4}},
                        new MyObject {Name = "List 3", Numbers = new[] {1, 2, 3, 4}}
                    };

        dataGrid.ItemsSource = mList;
        var columnNames = new[] {"List", "Number 1", "Number 2", "Number 3", "Number 4"};
        AddColumns(dataGrid, columnNames);

        mList[0].Name = "Test";   //Works
        mList[0].Numbers[0] = 123;  //Works

    }
    private void AddColumns(DataGrid gv, string[] columnNames)
    {
        for (int i = 0; i < columnNames.Length; i++)
            gv.Columns.Add(new DataGridTextColumn()
                               {
                                   Header = columnNames[i],
                                   Binding = new Binding(String.Format("[{0}]", i))
                               });

    }

    private void ButtonClick(object sender, RoutedEventArgs e)
    {
        mList[0].Name = "Test test";   //Don't work
        mList[0].Numbers[0] = 234;  //Don't work
    }
}

MainWindow.xaml

<StackPanel>
    <Button Click="ButtonClick">Test</Button>
    <DataGrid Height="Auto" Name="dataGrid" AutoGenerateColumns="False"/>
</StackPanel>

修改 这是一个mofidifed MyObject,我仍然无法从代码中更改名称

 public class MyObject : IEnumerable<object[]>, INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value;
            OnPropertyChanged("Name");
        }
    }

    public int[] Numbers { get; set; }

    public IEnumerator<object[]> GetEnumerator()
    {
        var obj = new object[Numbers.Length + 1];
        obj[0] = Name;
        for (var i = 0; i < Numbers.Length; i++)
            obj[i + 1] = Numbers[i];

        yield return obj;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你的//工作正常,因为它在ctor :) 您需要在MyObject类中实现INotifyPropertyChanged,并在Property更改时引发它。

对于您的Numbers属性,您应该使用int包装器,它也实现了INotifyPropertyChanged。

答案 1 :(得分:2)

问题在于使用以下代码

Binding = new Binding(String.Format("[{0}]", i))

将每列绑定到类似[i]的路径。

例如,在第0列(绑定到属性Name)的情况下,您需要

new Binding("Name")

使用此代码,您应该在执行

后看到您的数据网格更新
mList[0].Name = "Test test";  

相同的概念对其他列

有效