像往常一样,我做了一些研究,但在网站或其他地方找不到答案。如果你能指出我现有的问题,我会很感激。否则,这是一个问题:
我有一个ListView
对象绑定到DataTable
对象。见下面的定义:
<ListView Name="MyList">
<ListView.View>
<GridView>
<GridViewColumn x:Name="Column1Name" DisplayMemberBinding="{Binding Path=Column1}" />
<GridViewColumn x:Name="Column2Name" DisplayMemberBinding="{Binding Path=Column2}" />
<GridViewColumn x:Name="Column3Name" DisplayMemberBinding="{Binding Path=Column3}" />
<GridViewColumn x:Name="Column4Name" DisplayMemberBinding="{Binding Path=Column4}" />
</GridView>
</ListView.View>
</ListView>
绑定代码如下:
DataTable items = new DataTable();
items = DatabaseService.GetMyItems(20, true, items);
Binding binding = new Binding();
binding.Source = items.DefaultView;
binding.Mode = BindingMode.OneWay;
MyList.SetBinding(ListView.ItemsSourceProperty, binding);
执行查询的实际代码如下:
/** Parameters: commandText = <sql>, table = items */
using (DbConnection connection = new SqlConnection(Project.Properties.Settings.Default.ConnectionString))
{
using (DbCommand command = connection.CreateCommand())
{
command.CommandText = commandText;
command.CommandType = CommandType.Text;
using (DbDataAdapter dataAdapter = new SqlDataAdapter())
{
dataAdapter.SelectCommand = command;
dataAdapter.Fill(table);
}
}
}
此代码第一次运行,但在数据更改后再次调用GetMyItems
方法时,数据不会刷新。
我做错了什么?
答案 0 :(得分:1)
如果第一次工作是从构造函数开始工作,一旦加载了您的视图,那么您需要notify that your property change。
在GetMyItems方法中使用:
OnPropertyChanged("items");
然后声明方法:
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
通常,如果您没有使用预构建的MVVM Framework从NotifyPropertyChanged对象继承,以便在ViewModel中获取OnPropertyChanged方法。
在DataTable中有一个可观察的属性并不重要,问题是更改通知。你需要一个 ObservableCollection 。您可以将DataTable(DataSet由一个或多个DataTable构造)转换为ObservableCollection,然后转换为bind ObservableCollection to UI element。