使用 Caliburn micro 和 MVVM 时在列表视图中对项目进行分组
Grouping items in a listview when using Caliburn micro and MVVM
我是 MVVM 的新手。我用谷歌搜索了这个荒谬问题的废话,但找不到任何东西。
我的表单上有一个 Listview,我用数据库调用填充了它。没关系,但我想通过名为 Status.属性 的 属性 对列表视图中的项目进行分组。
通常这不会有问题,我会在绑定数据后向控件添加一个 PropertyGroupDescription,但是 MVVM 方面的事情妨碍了。
当我在视图模型中设置数据 属性 时,我无法在控件上设置 PropertyGroupDescription,因为我无法在 ViewModel 中访问它。
我无法在 xaml 代码隐藏中设置它,因为当数据更改时我无法触发任何事件。
我知道对于你们这些知情人士来说,这可能是一个简单得可笑的问题,但我觉得我在用头撞墙,所以我实际上创建了一个 Whosebug 帐户 :)
viewModel代码
class SearchViewModel : Screen
{
private BindableCollection<Claim> _searchResults;
private string _searchString;
public string SearchString
{
get { return _searchString; }
set { _searchString = value; }
}
public BindableCollection<Claim> SearchResults
{
get { return _searchResults; }
set
{
_searchResults = value;
NotifyOfPropertyChange(() => SearchResults);
}
}
public async void DoSearch()
{
List<Claim> results = await AugmentorCore.Search.SearchTelephones(SearchString);
SearchResults = new BindableCollection<Claim>(results);
}
public void SearchBoxKeyDown(ActionExecutionContext context)
{
KeyEventArgs keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs.Key == Key.Enter)
DoSearch();
}
public void SearchResultsUpdated(ActionExecutionContext context)
{
// Trying to get an event on the control to fire this.
//ListView source = context.Source as ListView;
//CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(source.ItemsSource);
//PropertyGroupDescription groupDescription = new PropertyGroupDescription("status");
//view.GroupDescriptions.Add(groupDescription);
MessageBox.Show("In SearchResultsUpdated");
}
}
XAML(缩写)
<ListView
DockPanel.Dock="Top"
x:Name="SearchResults">
<ListView.View>
<GridView>
<GridViewColumn
Header="Case/Name"
Width="150"
DisplayMemberBinding="{Binding reference}"/>
</GridView>
</ListView.View>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock FontWeight="Bold" FontSize="14" Text="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
希望我已经正确理解了您的问题。您可以执行以下操作。
<ListView ItemsSource="{Binding}">
<ListBox.DataContext>
<CollectionViewSource Source="{Binding SearchResults}" >
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Status" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</ListBox.DataContext>
....
...
</ListView>
我是 MVVM 的新手。我用谷歌搜索了这个荒谬问题的废话,但找不到任何东西。
我的表单上有一个 Listview,我用数据库调用填充了它。没关系,但我想通过名为 Status.属性 的 属性 对列表视图中的项目进行分组。
通常这不会有问题,我会在绑定数据后向控件添加一个 PropertyGroupDescription,但是 MVVM 方面的事情妨碍了。
当我在视图模型中设置数据 属性 时,我无法在控件上设置 PropertyGroupDescription,因为我无法在 ViewModel 中访问它。
我无法在 xaml 代码隐藏中设置它,因为当数据更改时我无法触发任何事件。
我知道对于你们这些知情人士来说,这可能是一个简单得可笑的问题,但我觉得我在用头撞墙,所以我实际上创建了一个 Whosebug 帐户 :)
viewModel代码
class SearchViewModel : Screen
{
private BindableCollection<Claim> _searchResults;
private string _searchString;
public string SearchString
{
get { return _searchString; }
set { _searchString = value; }
}
public BindableCollection<Claim> SearchResults
{
get { return _searchResults; }
set
{
_searchResults = value;
NotifyOfPropertyChange(() => SearchResults);
}
}
public async void DoSearch()
{
List<Claim> results = await AugmentorCore.Search.SearchTelephones(SearchString);
SearchResults = new BindableCollection<Claim>(results);
}
public void SearchBoxKeyDown(ActionExecutionContext context)
{
KeyEventArgs keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs.Key == Key.Enter)
DoSearch();
}
public void SearchResultsUpdated(ActionExecutionContext context)
{
// Trying to get an event on the control to fire this.
//ListView source = context.Source as ListView;
//CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(source.ItemsSource);
//PropertyGroupDescription groupDescription = new PropertyGroupDescription("status");
//view.GroupDescriptions.Add(groupDescription);
MessageBox.Show("In SearchResultsUpdated");
}
}
XAML(缩写)
<ListView
DockPanel.Dock="Top"
x:Name="SearchResults">
<ListView.View>
<GridView>
<GridViewColumn
Header="Case/Name"
Width="150"
DisplayMemberBinding="{Binding reference}"/>
</GridView>
</ListView.View>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock FontWeight="Bold" FontSize="14" Text="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
希望我已经正确理解了您的问题。您可以执行以下操作。
<ListView ItemsSource="{Binding}">
<ListBox.DataContext>
<CollectionViewSource Source="{Binding SearchResults}" >
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Status" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</ListBox.DataContext>
....
...
</ListView>