gpt4 book ai didi

c# - 如何从绑定(bind)到 CollectionViewSource 的列表框中找到正确的项目

转载 作者:行者123 更新时间:2023-12-03 10:40:03 25 4
gpt4 key购买 nike

我有一个 ListBox它的 ItemsSource 绑定(bind)到 CollectionViewSource,而 CollectionViewSource 又绑定(bind)到 ObservableCollection。

ListBoxItem 的模板包括 复选框 选中时,表示该项目已被选中。

我的问题是,我不知道如何找出哪些项目的复选框被点击了。

最佳答案

复选框绑定(bind)到什么?如果它绑定(bind)到集合中对象的属性,那么您不需要确定单击了哪个复选框。如果它没有绑定(bind)到对象或 ViewModel 上的某些东西,您可能能够从列表框中获取 SelectedItem。

以前我已经将 listBox 的 SelectedItem 属性绑定(bind)到我的 ViewModel 上的一个属性,这样我就可以在它发生变化时运行它。

至于获取索引,您应该能够将从列表框返回的 idex 与 CollectionViewSource.View 中的项目索引匹配,该项目包含按显示顺序显示的集合的当前 View 。

如果您不使用 MVVM,我建议您这样做。我一开始不使用它,很快就陷入了代码隐藏的泥潭。

MVVM 中的示例

假设我们有具有三个字符串属性和一个 bool 值的 MyClass。在 MVVM 中,我们有一个 MyClassViewModel,它有一个属性来包含一个 MyClass 的实例以及 View 所需的任何功能(在这种情况下是一个列表框项)。我们还有一个 MyWindowViewModel,它将保存数据的集合以及我们主视图的其他内容。

<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>

示例 View 模型
Public Class MainViewModel
Inherits ViewModelBase

Public Property MyClassCollection as New ObservableCollection(Of MyClassViewModel)

End Class

Public Class MyClassViewModel
Inherits ViewModelBase

Public Property ModelClass as MyClass

Public Sub New()
End Sub
Public Sub New(ByRef CustClass as MyClass)
ModelClass = CustClass
End Sub

End Class

当我们得到我们的数据时,我们把它放在 ObservableCollection(Of MyClassViewModel) 中。我通常在数据检索后台工作程序的 WorkCompleted 处理程序中执行此操作。
   For Each mc as MyClass in e.Results
MyClassCollection.Add(New MyClassViewModel(mc)
Next

列表框仍将通过 collectionViewSource 从可观察集合中获取其项目,但现在它们将是 MyClassViewModel 类型。
<DataTemplate DataType="{x:Type local:MyClassViewModel}">
<Border BorderBrush="#FF036200" BorderThickness="1" Background="#FF3CC600" CornerRadius="10">
<Grid Height="Auto" Margin="4" DataContext={Binding ModelClass}>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding StringProp1}" VerticalAlignment="Top" Margin="0" FontSize="16"/>
<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding StringProp2}" VerticalAlignment="Top" Margin="0" Grid.Row="1" FontSize="16"/>
<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding StringProp3}" VerticalAlignment="Top" Grid.Column="1" Margin="0" FontSize="16"/>
<CheckBox Content="Is Bool True?" HorizontalAlignment="Left" IsChecked="{Binding BoolProp}" VerticalAlignment="Top" Grid.Column="1" Margin="0" Grid.Row="1" FontSize="16"/>
</Grid>
</Border>
</DataTemplate>

因此,当有人单击复选框时,它会更改下面对象的值,并且由于列表框项代表 ViewModel,如果您想更改 ListBoxItem 上的某些内容,请将其数据绑定(bind)到 ViewModel 上的属性并更改该属性。

例如,假设您想在用户选中复选框时将 ListBoxItem 的颜色更改为随机颜色(无论出于何种原因,您都不想使用触发器或其他东西。您可以在 MyClassViewModel 上创建一个属性键入 Brush and Databind the Border.Background 和一个 Boolean 属性,它将 MyClass 属性设置为相同的值。在 boolean 属性的 setter 中,检查该值,如果为 true,则设置画笔值 (不包括随机刷生成器)。

通过这种方式,ViewModel 告诉 View 如何在模型中显示数据,并且可以拦截来自 View 的数据更改,并在必要时对其进行处理。
<DataTemplate DataType="{x:Type local:MyClassViewModel}">
<Border BorderBrush="#FF036200" BorderThickness="1" Background="{Binding BorderBackground}" CornerRadius="10">

回复评论

每个人都有自己的 MVVM 方式。我使用了几种不同类型的 ViewModel。有些是真正的表单 View 模型(用于控制表单的工作方式),模型 View 模型(用于告诉 View [通常是用于编辑详细信息的用户控件或 ItemsControl DataTemplate] 如何显示数据)。对于表单 View 模型,我有时会根据情况将它们分解为 NavigationViewModel 和记录维护 View 模型。

在这种情况下,我确实有一个用于控制表单的 ViewModel 和一个用于显示数据的 ViewModel。表单 View 模型通常处理用于在集合中添加或删除项目的按钮命令,或指定告诉 View 是否启用保存或其他操作按钮的逻辑。

INotifyPropertyChanged

实现 INPC 的非常轻量级的 ViewModelBase 类
Imports System.ComponentModel

Public MustInherit Class ViewModelBase
Implements INotifyPropertyChanged

Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged

Protected Sub OnPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub

End Class

在继承的 ViewModel 中:
Public Property IsSelected() As Boolean
Get
Return m_IsSelected
End Get
Set(ByVal value As Boolean)
m_IsSelected = value
OnPropertyChanged("IsSelected")
End Set
End Property

关于c# - 如何从绑定(bind)到 CollectionViewSource 的列表框中找到正确的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7349235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com