【问题标题】:Binding ObservableCollection to a listView programmatically以编程方式将 ObservableCollection 绑定到 listView
【发布时间】:2016-04-08 15:25:18
【问题描述】:

关于如何通过 XAML 将 ObservableCollection 绑定到 ListView 存在很多问题。我需要如何以编程方式将集合绑定到 ListView。有一些问题会有所帮助,但它们仍然不能完全解决我的需要。

我有这些课程:

public class myTask
{
    public DateTime TaskDate { get;}
    public string   TaskName { get;}

}
public class myTaskList : List<myTask>
{
    public ObservableCollection<myTask> getMyTasks(DateTime d)
    {
        ObservableCollection<myTask> t = new ObservableCollection<myTask>
                        (this.Where(x => x.TaskDate == d).ToList<myTask>());
        return t;
    }
}

我只想在运行时将 getMyTasks 结果的 TaskName 绑定到列表视图。我试过这种方法:

    ListView lv = new ListView();
    //assuming I declare myTaskList a static class
    lv.DataContext = myTaskList.getMyTasks(DateTime.Now); 
    var binding = new Binding();
    binding.Source = lv;
    lv.SetBinding(ListView.ItemsSourceProperty, binding);

那可能只能将结果绑定到列表中,如何只在结果中绑定TaskName?

【问题讨论】:

    标签: c# listview winrt-xaml


    【解决方案1】:

    如果没有一个好的Minimal, Complete, and Verifiable example 可以清楚地说明您的问题,就不可能确定您需要什么答案。但是……

    这里似乎根本没有绑定操作。您显示的绑定代码创建了一个循环绑定(将ListView 对象的ItemsSource 属性绑定到自身),这似乎没有用。更重要的是,您应该能够通过分配ItemsSource 属性和DisplayMemberPath 属性来完成您想要的操作:

    lv.ItemsSource = myTaskList.getMyTasks(DateTime.Now);
    lv.DisplayMemberPath = "TaskName";
    

    根本不需要创建绑定。

    【讨论】:

      【解决方案2】:

      我想我终于找到了适用于我的场景的解决方案。

      可以将多个字段的 ObservableCollection 数据集的字段绑定到列表视图。我们需要做的是在资源中声明一个数据模板:

      <DataTemplate x:Key='myTaskItemTemplate'>
                  <TextBlock x:Name='ItemTaskName'
                                       FontSize='15' 
                                       HorizontalAlignment='Stretch'
                                       VerticalAlignment='Stretch'
                                       TextAlignment='Center'
                                       Text='{Binding TaskName}' />
          </DataTemplate>
      

      然后使用上面的模板创建listview

      ListView lv = new ListView { ItemTemplate = (DataTemplate)Resources["myTaskItemTemplate"] };
      

      然后创建一个绑定,源是绑定到列表视图的 ItemSourceProperty 的 ObservableCollection 数据集

          var t = myCalendarMonth.TaskList(d.theDate);
          lv.DataContext = t;
          var binding = new Binding();
          binding.Source = t;
          lv.SetBinding(ListView.ItemsSourceProperty, binding);
      

      我确信可能有很多更好的解决方案,因为我对 XAML 很陌生,但所讨论的方法似乎产生了我正在寻找的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 2018-05-21
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多