我收集了一些对象, 在对象内部将会有一些属性和动态对象列表。 我举个例子, 用名称和数字属性来说明这一点 。
Now I got it to look right, but I m having problems changing the data from code behind. If I change something in the mList inside the MainWindow() it s correctly beeing displayed on my DataGrid, but If I do the same inside a Click even t nothing happens.
我看过《通知改变财产》,但是没有改变任何东西。
请不要将此作为我为这个问题创建的样板项目
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();
}
}
主窗口.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
}
}
主窗口. xaml
<StackPanel>
<Button Click="ButtonClick">Test</Button>
<DataGrid Height="Auto" Name="dataGrid" AutoGenerateColumns="False"/>
</StackPanel>
EDIT This is a mofidifed MyObject, I m still not able to change the Name from code
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));
}
}
}