【问题标题】:DataGrid bind to ObservableCollectionDataGrid 绑定到 ObservableCollection
【发布时间】:2016-09-13 19:18:30
【问题描述】:

我正在尝试将 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);
}

我在这里错过了什么?

【问题讨论】:

  • 为什么不在 XAML 中绑定?
  • 我试过了,但我也应该在那里遗漏更多的东西,因为当我这样做时,我没有得到任何数据。 XAML 等效项是什么?
  • 好吧,你不能那么容易地设置Source,但通常你不会那样做,而是使用隐含的DataContext
  • 我是怎么做到的?抱歉,我是 WPF 的新手

标签: c# wpf data-binding datagrid observablecollection


【解决方案1】:

如果代码中有任何内容,只会设置DataContext

this.DataContext = model;
<DataGrid ItemsSource="{Binding Requests}" ... />

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


从 cmets 看来,您的问题似乎很明显是您滥用代码。通常,每当我使用ObeservableCollections 时,我都会通过使其只读和获取来防止这种情况:

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

【讨论】:

  • 应该够了,真的。您是否让项目至少显示一次?
  • 是的,第一次。然后其他时间不更新
  • 我对计时器所做的是更新:requests = RequestAction.getRequestList();
  • 那么你的计时器做错了,比如在不使用属性的情况下替换了字段,从而绕过了对PropertyChanged的调用。
  • 你是对的!我是按字段而不是按属性更新的。感谢您的帮助!
猜你喜欢
  • 2013-09-07
  • 2013-10-14
  • 1970-01-01
  • 2012-12-19
  • 2012-04-02
  • 1970-01-01
  • 2015-01-26
  • 2015-04-02
相关资源
最近更新 更多