DataGrid 绑定到 ObservableCollection
DataGrid bind to ObservableCollection
我正在尝试将我的 ViewModel 上的 ObservableCollection 绑定到我视图上的 DataGrid:
public class RequestListViewModel : INotifyPropertyChanged
{
private ObservableCollection<Request> requests;
private Timer uTimer;
public RequestListViewModel()
{
requests = RequestAction.getRequestList();
SetRequestsUpdateTimer();
}
public ObservableCollection<Request> Requests
{
get { return requests; }
set { requests = value; OnPropertyChanged("Requests"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
此 ObservableCollection 已使用计时器更新并且工作正常。数据已更新。问题是更新没有反映在视图端:
<DataGrid Name="lstRequests" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" MouseDoubleClick ="myDataGrid_MouseDoubleClick"
>
<DataGrid.Columns>
...
</DataGrid.Columns>
我这样创建绑定:
public RequestListView()
{
InitializeComponent();
model = new RequestListViewModel();
//this.DataContext = model;
lstRequests.ItemsSource = model.Requests;
Binding myBinding = new Binding();
myBinding.Source = model;
myBinding.Path = new PropertyPath("Requests");
myBinding.Mode = BindingMode.TwoWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
lstRequests.SetBinding(DataGrid.ItemsSourceProperty, myBinding);
}
我在这里错过了什么?
如果代码中有任何内容,只会设置 DataContext
:
this.DataContext = model;
<DataGrid ItemsSource="{Binding Requests}" ... />
TwoWay
和UpdateSourceTrigger
是无意义的,不适用于ItemsSource
。如果您沿层次结构更改 DataContext
,此绑定当然会失败。此外,如果您完全关闭模型并且不更新 DataContext
绑定也将不再更新。
从评论中可以清楚地看出您的问题是您滥用了您的代码。通常,每当我使用 ObeservableCollections
时,我都会通过使其只读和获取来防止这种情况:
private readonly ObeservableCollection<...> _field = new ObeservableCollection<...>();
public ObeservableCollection<...> Property { get { return _field; } }
我正在尝试将我的 ViewModel 上的 ObservableCollection 绑定到我视图上的 DataGrid:
public class RequestListViewModel : INotifyPropertyChanged
{
private ObservableCollection<Request> requests;
private Timer uTimer;
public RequestListViewModel()
{
requests = RequestAction.getRequestList();
SetRequestsUpdateTimer();
}
public ObservableCollection<Request> Requests
{
get { return requests; }
set { requests = value; OnPropertyChanged("Requests"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
此 ObservableCollection 已使用计时器更新并且工作正常。数据已更新。问题是更新没有反映在视图端:
<DataGrid Name="lstRequests" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" MouseDoubleClick ="myDataGrid_MouseDoubleClick"
>
<DataGrid.Columns>
...
</DataGrid.Columns>
我这样创建绑定:
public RequestListView()
{
InitializeComponent();
model = new RequestListViewModel();
//this.DataContext = model;
lstRequests.ItemsSource = model.Requests;
Binding myBinding = new Binding();
myBinding.Source = model;
myBinding.Path = new PropertyPath("Requests");
myBinding.Mode = BindingMode.TwoWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
lstRequests.SetBinding(DataGrid.ItemsSourceProperty, myBinding);
}
我在这里错过了什么?
如果代码中有任何内容,只会设置 DataContext
:
this.DataContext = model;
<DataGrid ItemsSource="{Binding Requests}" ... />
TwoWay
和UpdateSourceTrigger
是无意义的,不适用于ItemsSource
。如果您沿层次结构更改 DataContext
,此绑定当然会失败。此外,如果您完全关闭模型并且不更新 DataContext
绑定也将不再更新。
从评论中可以清楚地看出您的问题是您滥用了您的代码。通常,每当我使用 ObeservableCollections
时,我都会通过使其只读和获取来防止这种情况:
private readonly ObeservableCollection<...> _field = new ObeservableCollection<...>();
public ObeservableCollection<...> Property { get { return _field; } }