问题描述
我对 MVVM 完全陌生。我用谷歌搜索了这个荒谬的问题,但找不到任何东西。
我的表单上有一个 Listview,我用 DB 调用填充了它。这一切都很好,但我想通过一个名为 Status 的属性对列表视图中的项目进行分组。
通常这不会有问题,我会在绑定数据后向控件添加一个 PropertyGroupDescription,但 MVVM 方面的事情正在妨碍。
当我在视图模型中设置数据属性时,我无法在控件上设置 PropertyGroupDescription,因为我无法在 viewmodel 中访问它。
我无法在 xaml 代码隐藏中设置它,因为我无法在数据更改时触发任何事件。
我知道这对于知情的人来说可能是一个非常简单的问题,但我觉得我在这里撞到了砖墙,以至于我实际上创建了一个 StackOverflow 帐户:)
视图模型代码
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>