c# - 使用 MVVM 管理多项选择

标签 c# .net data-binding mvvm

在学习 MVVM 的过程中,我对 WPF 和 ViewModel 模式有了一些基本的了解。我在提供列表时使用以下抽象并且对单个选定项目感兴趣。

public ObservableCollection<OrderViewModel> Orders { get; private set; }
public ICollectionView OrdersView
{
    get
    {
        if( _ordersView == null )
            _ordersView = CollectionViewSource.GetDefaultView( Orders );
        return _ordersView;
    }
}
private ICollectionView _ordersView;

public OrderViewModel CurrentOrder 
{ 
    get { return OrdersView.CurrentItem as OrderViewModel; } 
    set { OrdersView.MoveCurrentTo( value ); } 
}

然后我可以将 OrdersView 连同支持的排序和过滤一起绑定(bind)到 WPF 中的列表:

<ListView ItemsSource="{Binding Path=OrdersView}" 
          IsSynchronizedWithCurrentItem="True">

这对于单选 View 非常有效。但我还想在 View 中支持多项选择,并将模型绑定(bind)到所选项目的列表。

我如何将 ListView.SelectedItems 绑定(bind)到 ViewModel 的支持者属性?

最佳答案

IsSelected 属性添加到您的子 ViewModel(在您的情况下为 OrderViewModel):

public bool IsSelected { get; set; }

将容器上的选定属性绑定(bind)到此(在本例中为 ListBox):

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
    </Style>
</ListBox.ItemContainerStyle>

IsSelected 已更新以匹配容器上的相应字段。

您可以通过执行以下操作在 View 模型中获取选定的 child :

public IEnumerable<OrderViewModel> SelectedOrders
{
    get { return Orders.Where(o => o.IsSelected); }
}

关于c# - 使用 MVVM 管理多项选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803216/

相关文章:

c# - 我可以重构模型 View 查询处理程序吗?

wpf - XAML:在普通 XAML 中引用 StaticResource? (无标记扩展)

c# - Controller 注册为 transient ,但实现了 IDisposable

c# - SignalR - 非常初学者

data-binding - 数据上下文更改时进度条上可能存在数据绑定(bind)错误 (Silverlight 4)

wpf - Label 和 GroupBox 触发器不起作用,相同的触发器适用于 StackPanel

c# - 如何正确释放Outlook对象?

c# - 是否允许在类外修改 C# 只读字段?

c# - Entity Framework 等同于多个连接?

c# - 我怎样才能避免错误地更新当前对象上的另一个对象?