【问题标题】:Can I update the UI from a LINQ binding?我可以从 LINQ 绑定更新 UI 吗?
【发布时间】:2010-12-31 22:12:07
【问题描述】:

这段代码将帮助我描述我的问题:

public class Car
{
    ...
}

public class CarQueue : ObservableCollection<Car>
{
    public IEnumerable Brands
    {
        get { return (from Car c in this.Items select c.Brand).Distinct(); }
    }
}

好的,现在我有一个绑定到 DataGrid 的 CarQueue 类的实例。当我将 Car 对象添加到队列中时,数据网格会自行更新,但我还有一个绑定到不更新的“Brands”属性的列表框。下面是一个简单的代码序列来解释:

CarQueue cq = new CarQueue();
DataGrid1.ItemsSource = cq;
ListBox1.ItemsSource = cq.Brands;  // all above done during window load
...
Car c;
cq.Add(c); // datagrid updates, but not listbox

列表框是否因为绑定到具有动态 LINQ 查询的属性而没有更新?

我尝试的另一件事是继承 INotifyPropertyChanged 并向 CollectionChanged 事件添加新的事件处理程序(在我的 CarQueue 构造函数中):

this.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(CarQueue_CollectionChanged);

然后在事件处理程序中:

void CarQueue_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    PropertyChanged(this, new PropertyChangedEventArgs("Brands"));
}

这也不起作用。那么有人知道问题是什么吗?谢谢

【问题讨论】:

    标签: c# .net wpf linq datagrid


    【解决方案1】:

    这里有几个问题。

    Brands 属性是 LINQ 在被请求时动态构建的序列。 WPF 仅在初始绑定期间询问它:它无法知道如果再次询问它会得到不同的答案,所以它不会。要让 WPF 跟踪 Brands 集合的更改,您需要将 Brands 公开为一个集合,并在该集合上实现 INotifyCollectionChanged - 例如通过将 Brands 设为 ObservableCollection。一种方法是使用Bindable LINQ

    作为替代方案,您可以使用第二种方法,即为 Brands 引发 PropertyChanged 事件。但是,为了使其工作,您必须将 ItemsSource 绑定到 Brands。 (此时,您正在分配它,这意味着 WPF 忘记了集合的来源,只保留其值的私有副本。)为此,请使用 XAML 中的 {Binding} 标记扩展:

    <ListBox ItemsSource="{Binding Brands}" />  <!-- assumes DataContext is cq -->
    

    或使用 BindingOperations.SetBinding:

    BindingOperations.SetBinding(ListBox1, ListBox.ItemsSourceProperty,
      new Binding("Brands") { Source = cq });
    

    【讨论】:

    • 完美。我刚刚在 XAML 中进行了绑定,它可以工作。可绑定的 LINQ 看起来对我来说非常有用,所以谢谢。
    • 作为记录,我注意到 Bindable LINQ 似乎已经有一段时间没有更新了,但是还有另一个名为 Continuous LINQ 的项目似乎在做一些相同的事情。没试过,但如果你想尝试一下,可以从codeplex.com/clinq 获得。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2016-07-10
    • 2022-01-20
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多