以编程方式将 ObservableCollection 绑定到 listView
Binding ObservableCollection to a listView programmatically
关于如何通过 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?
如果没有一个很好的 Minimal, Complete, and Verifiable example 清楚地说明您的问题,就不可能确定您需要什么答案。但是……
这里好像根本没有绑定操作。您显示的绑定代码创建了一个循环绑定(将 ListView
对象的 ItemsSource
属性 绑定到自身),这似乎没有用。更重要的是,你应该能够通过分配 ItemsSource
属性 和 DisplayMemberPath
属性:
来完成你想要的
lv.ItemsSource = myTaskList.getMyTasks(DateTime.Now);
lv.DisplayMemberPath = "TaskName";
根本不需要创建绑定。
我想我终于找到了适用于我的场景的解决方案。
可以将多个字段的 ObservableCollection 数据集的一个字段绑定到一个列表视图。我们需要做的是在资源中声明一个数据模板:
<DataTemplate x:Key='myTaskItemTemplate'>
<TextBlock x:Name='ItemTaskName'
FontSize='15'
HorizontalAlignment='Stretch'
VerticalAlignment='Stretch'
TextAlignment='Center'
Text='{Binding TaskName}' />
</DataTemplate>
然后使用上面的模板创建列表视图
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 还很陌生,但讨论的方法似乎产生了我正在寻找的结果。
关于如何通过 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?
如果没有一个很好的 Minimal, Complete, and Verifiable example 清楚地说明您的问题,就不可能确定您需要什么答案。但是……
这里好像根本没有绑定操作。您显示的绑定代码创建了一个循环绑定(将 ListView
对象的 ItemsSource
属性 绑定到自身),这似乎没有用。更重要的是,你应该能够通过分配 ItemsSource
属性 和 DisplayMemberPath
属性:
lv.ItemsSource = myTaskList.getMyTasks(DateTime.Now);
lv.DisplayMemberPath = "TaskName";
根本不需要创建绑定。
我想我终于找到了适用于我的场景的解决方案。
可以将多个字段的 ObservableCollection 数据集的一个字段绑定到一个列表视图。我们需要做的是在资源中声明一个数据模板:
<DataTemplate x:Key='myTaskItemTemplate'>
<TextBlock x:Name='ItemTaskName'
FontSize='15'
HorizontalAlignment='Stretch'
VerticalAlignment='Stretch'
TextAlignment='Center'
Text='{Binding TaskName}' />
</DataTemplate>
然后使用上面的模板创建列表视图
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 还很陌生,但讨论的方法似乎产生了我正在寻找的结果。