- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个绑定(bind)到 collectionviewsource 的数据网格,它绑定(bind)到一个 observablecollection。按照指南,我将其设置如下:
我的 Persons 类:
public class Persons : ObservableCollection<Person>
{
//...
}
xaml 数据绑定(bind):
<Window.Resources>
<local:Persons x:Key="_Persons"/>
<CollectionViewSource x:Key="cvsPersons" Source="{StaticResource _Persons}" />
</Window.Resources>
数据网格绑定(bind):
<DataGrid x:Name="myDataGrid" ItemsSource="{Binding Source={StaticResource cvsPersons}}"/>
背后的代码:
_Persons = (Persons)this.Resources["_Persons"];
_persons = //some method to fill perons;
cvsPersons = (CollectionViewSource)this.Resources["cvsPersons"];
cvsPersons.Source = _Persons;
以上作品。 我的问题是,为什么我需要在后面的代码中使用 cvsPersons.Source = _Persons; 设置 collectionviewsource.source?我认为我第一个片段中的 xaml 完成了这项工作:
_cvsPersons.Source = _Persons;
如果我需要所有这些代码在后面,那么 xaml 数据绑定(bind)代码似乎没有什么用处,我还不如在代码后面做所有事情。根据我(也许很少)的理解,代码隐藏中唯一需要的代码是引用 xaml 设置的实例,即:
_Persons = (Persons)this.Resources["_Persons"];
_persons = //some method to fill perons;
cvsPersons = (CollectionViewSource)this.Resources["cvsPersons"];
如果我没有 _cvsPersons.Source = _Persons;那么我的数据网格就不会被填充。我目前的 xaml 无法完成这项工作。我想我的问题更多的是与概念相关..
最佳答案
为了避免代码隐藏方法,您应该使用 MVVM 模式 MVVM Model View ViewModel .一个可能的解决方案是像这样的“人”(充当模型):
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
您可以实现一个 ViewModel,使用一个 ObservableCollection of Persons 来初始化一个属性。
public class ViewModel
{
public ObservableCollection<Person> Persons { get; set; }
public ViewModel()
{
Persons = new ObservableCollection<Person>();
}
}
您的 MainWindow.cs 现在必须初始化 ViewModel:
public partial class MainWindow : Window
{
public ViewModel ViewModel;
public MainWindow()
{
ViewModel = new ViewModel();
ViewModel.Persons.Add(new Person
{
Age = 29,
Name = "Mustermann"
});
ViewModel.Persons.Add(new Person
{
Age = 35,
Name = "Meyer"
});
this.DataContext = ViewModel;
InitializeComponent();
}
将 DataContext 设置为 ViewModel 对象很重要。我添加了一个按钮和添加一个人的方法。
private void AddPersonOnClick(object sender, RoutedEventArgs e)
{
ViewModel.Persons.Add(new Person
{
Age = 55,
Name = "Sand"
});
}
现在您可以在 XAML 中实例化 CollectionViewSource 并将其绑定(bind)到 ViewModel 中的 Persons ObservableCollection 属性。
<Window x:Class="DataGridStackoverflow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<CollectionViewSource x:Key="PersonsCollectionViewSource" Source="{Binding Persons}" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" ItemsSource="{Binding Source={StaticResource PersonsCollectionViewSource}}" />
<Button x:Name="AddPerson" Grid.Row="1" Click="AddPersonOnClick" HorizontalAlignment="Left">Add Person</Button>
</Grid>
最后,您必须在将 ItemsSource 发布到 CollectionViewSource 时设置 ItemsSource,它的效果非常好。
编辑
我尝试了您的解决方案,效果也不错。主窗口.xaml:
<Window.Resources>
<dataGridStackoverflow:Persons x:Key="Persons" />
<CollectionViewSource x:Key="PersonsCollectionViewSource" Source="{StaticResource Persons}" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" ItemsSource="{Binding Source={StaticResource PersonsCollectionViewSource}}" />
<Button x:Name="AddPerson" Grid.Row="1" Click="AddPersonOnClick" HorizontalAlignment="Left">Add Person</Button>
</Grid>
在 InitializeComponent() 之后初始化 Persons 集合很重要。主窗口.cs
InitializeComponent();
Persons persons = (Persons)this.FindResource("Persons");
persons.Add(new Person
{
Age = 23,
Name = "Dude"
});
此解决方案无需代码隐藏结构即可设置 ItemsSource。
关于c# - 如何使用 xaml 将数据网格绑定(bind)到 collectionviewsource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27227262/
我是 WPF 新手,尝试使用自定义排序对 CollectionViewSource 进行排序时遇到了困难。情况如下: 我有一个使用参数调用的 SearchView,它变成了它的 datacontext
tldr:CollectionViewSource.Filter 被另一个控件覆盖。我怎样才能有两层过滤,以便控件只能看到预过滤的集合? 我有一个第三方网格控件,我通过 ICollectionView
谁能告诉我如何在 Windows 8 上的 XAML 中设置 CollectionViewSource 的正确属性? x:name 是对象的名称。来源是什么? d:Source 和 Source 有
我正在使用 CollectionViewSource 对我的数据进行分组。在我的数据中,我需要对 Property1 和 Property2 进行分组。 唯一的规定是我不想要另一个组的子组。因此,当我
我正在尝试设置一个从 CollectionViewSource 获取数据的 ListBox。我想要发生的是,当我更新基础数据源时,列表框也会更新。我的 Xaml 看起来像这样......
我有一个 collectionviewsource 项目。每个项目都是一个对象,它有一个属性 SentTime 和另一个属性 ParentId。我想按 ParentId 对项目进行分组,并按以下方式对
我正在尝试向 CollectionViewSource 添加附加行为,以便我可以在 XAML 中的 View 模型上提供过滤器 Predicate 属性。 XAML 如下所示:
我想使用过滤器 将ComboBox 绑定(bind)到我的数据。为此,我创建了一个 TextBox 和一个 ComboBox。在后面的代码中,我读取了一个文件并生成了类 Channel 的对象,这些对
我正在将 ItemsControl 绑定(bind)到 CollectionViewSource。这是代码: this.Trucks = new ObservableCollection();
我正在将 ComboBox 绑定(bind)到实体,但我想过滤数据。 到目前为止我尝试了两种方式: “简单”一:直接将过滤器应用到 ObjectSet throughtLINQ 到实体 按照上文所述设
我正在尝试对 CollectionViewSource 进行基本使用,但我肯定遗漏了一些东西,因为它无法正常工作。这是我的 XAML:
我有一个需要过滤的“东西”列表,然后以分组和排序的方式显示。计算分组和排序顺序所需的数据不能作为简单的属性提供 - 需要在代码中完成一些工作来计算顺序和组。 CollectionViewSource
我有一个绑定(bind)到 CollectionViewSource 的 WPF ListView。它的来源绑定(bind)到一个属性,如果用户选择一个选项,它可以改变。 当 ListView 源由于
我真的很大ObservableCollection我需要对其提供用户友好的过滤。 public static async Task RefilterViewAsync(this ItemsContro
我编写了一个带有搜索扩展名的自定义 WPF 控件,我们将其命名为 MyControl . 控件是 ItemsControl 的后代类(class)。 所以我像这样将数据源提供给它: 控件本身使用 pr
我处于这种困境中,希望有人能帮助我 抱歉,我无法在此处粘贴代码作为在此处发布公司栏。 我试图在xaml中使用collectionviewsource。我尝试了两种方法,静态资源和cvs.source。
我在 DataGrid 中使用 CollectionViewSource 作为 ItemSource mLevelSource; public ObservableCollection LevelS
一段时间以来,我一直试图在我的数据网格中对数据进行分组,但没有成功。在我的 ViewModel 中,属性: public ObservableCollection Competitors { get;
我正在使用 MVVM 模式开发 WPF 桌面应用程序。 我试图根据 TextBox 中输入的文本从 ListView 中过滤出一些项目。我希望在更改文本时过滤 ListView 项目。 我想知道当过滤
我想将一个datagrid.itemssource绑定(bind)到一个匿名类型的列表,所以我将它绑定(bind)到一个collectionViewSource,但我需要在列表中添加或删除一个项目,但
我是一名优秀的程序员,十分优秀!