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}" ... />

TwoWayUpdateSourceTrigger是无意义的,不适用于ItemsSource。如果您沿层次结构更改 DataContext,此绑定当然会失败。此外,如果您完全关闭模型并且不更新 DataContext 绑定也将不再更新。


从评论中可以清楚地看出您的问题是您滥用了您的代码。通常,每当我使用 ObeservableCollections 时,我都会通过使其只读和获取来防止这种情况:

private readonly ObeservableCollection<...> _field = new ObeservableCollection<...>();
public ObeservableCollection<...> Property { get { return _field; } }