0

オブジェクトのコレクションがあり、オブジェクト内にはいくつかのプロパティとオブジェクトの動的リストがあります。私は、これが Name プロパティと Numbers プロパティで示されている私の例です。

今は正しく見えるようになりましたが、コードビハインドからデータを変更する際に問題があります。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>

編集 これは変更された 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));
        }
    }
}
4

2 に答える 2

3

問題は、次のコードで

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

[i] のようなパスに各列をバインドします。

たとえば、列 0 (プロパティ Name へのバインディング) の場合は、

new Binding("Name")

このコードを使用すると、実行後にデータグリッドの更新が表示されるはずです

mList[0].Name = "Test test";  

他の列についても同じ概念が有効です

于 2012-05-23T12:59:32.133 に答える