オブジェクトのコレクションがあり、オブジェクト内にはいくつかのプロパティとオブジェクトの動的リストがあります。私は、これが 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));
}
}
}