我有一个对象集合,在对象内部会有一些属性和一个动态的对象列表。我是我的例子,这是用名称和数字属性说明的。
现在我让它看起来正确,但我在修改代码背后的数据时遇到了问题。 如果我在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));
}
}
}
答案 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";
相同的概念对其他列
有效