【发布时间】:2014-06-06 10:02:47
【问题描述】:
我有一个DataGrid 绑定到SelectedQueryView.SelectedColumns,其中SelectedQueryView 是:
public QueryViewItem SelectedQueryView { get; set; }
而 QueryViewItem 是:
public class QueryViewItem : ViewModelBase
{
private string _viewIcon;
private string _viewName;
private string _tableName;
public string ViewIcon
{
[DebuggerStepThrough]
get { return _viewIcon; }
[DebuggerStepThrough]
set
{
if (value != _viewIcon)
{
_viewIcon = value;
OnPropertyChanged("ViewIcon");
}
}
}
public string ViewName
{
[DebuggerStepThrough]
get { return _viewName; }
[DebuggerStepThrough]
set
{
if (value != _viewName)
{
_viewName = value;
OnPropertyChanged("ViewName");
}
}
}
public string TableName
{
[DebuggerStepThrough]
get { return _tableName; }
[DebuggerStepThrough]
set
{
if (value != _tableName)
{
_tableName = value;
OnPropertyChanged("TableName");
}
}
}
public ObservableCollection<TableColumn> SelectedColumns { get; set; }
}
而且,TableColumn 是:
public class TableColumn : ViewModelBase
{
private string _tableSource;
public string TableSource
{
[DebuggerStepThrough]
get { return _tableSource; }
[DebuggerStepThrough]
set
{
if (value != _tableSource)
{
_tableSource = value;
OnPropertyChanged("TableSource");
}
}
}
private string _colName;
public string ColName
{
[DebuggerStepThrough]
get { return _colName; }
[DebuggerStepThrough]
set
{
if (value != _colName)
{
_colName = value;
OnPropertyChanged("ColName");
}
}
}
private string _customName;
public string CustomName
{
[DebuggerStepThrough]
get { return _customName; }
[DebuggerStepThrough]
set
{
if (value != _customName)
{
_customName = value;
OnPropertyChanged("CustomName");
}
}
}
public override string ToString()
{
string sRet;
if(ColName.Equals("*"))
sRet = TableSource + "." + ColName;
else
sRet = TableSource + "." + ColName + " AS " + CustomName;
return sRet;
}
}
最后,ViewModelBase 是:
公共类 ViewModelBase:INotifyPropertyChanged { 公共事件 PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(sender, e);
}
protected virtual void OnPropertyChanged(string PropertyName)
{
OnPropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
问题是,当我向SelectedQueryView.SelectedColumns 添加字段时,关联的DataGrid 不会更新,即使SelectedColumns 是ObservableCollection。
Xaml
<DataGrid Grid.Row="0" Grid.Column="2" ItemsSource="{Binding Path=SelectedQueryView.SelectedColumns}" BorderBrush="Black" Margin="5" SelectedItem="{Binding Path=SelectedDestColumn}" AutoGenerateColumns="False" GridLinesVisibility="None" CanUserAddRows="False" RowEditEnding="DataGrid_RowEditEnding" RowHeaderWidth="0" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding Path=ColName}" IsReadOnly="True"/>
<DataGridTextColumn Header="Custom Name" Width="*" Binding="{Binding Path=CustomName}" />
</DataGrid.Columns>
</DataGrid>
谁能解释一下为什么以及如何解决这个问题?
【问题讨论】:
-
QueryViewItem 类需要实现属性更改通知。你需要看一下如何开始的sn-p吗?
-
好的,谢谢;会很有用的。
-
看看这个答案是否能帮助你“明白”
-
@Riccardo 如果它是一个 observablecollection 那么向它添加对象应该在 UI 上自动更新..在这种情况下你不需要调用 PropertyChanged 来在视图上添加项目..你能分享一下你的情况吗在集合中添加元素并将您的集合绑定到视图
-
@nit 这是我在集合中添加元素的方法: SelectedQueryView.SelectedColumns.Add(column);其中 column 是 TableColumn 对象
标签: wpf xaml datagrid observablecollection