gpt4 book ai didi

WPF Xaml GridView SelectionChanged 行为

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

我正在使用 Prism.MVVM 使用 WPF View ,它允许我们的用户编辑记录。
最初要编辑的记录是通过 ComboBox 选择的。

<ComboBox IsSynchronizedWithCurrentItem="True" 
ItemsSource="{Binding Records}"
SelectedItem="{Binding SelectedRecord}"/>

这行得通,但是用户想要一种更有效的方法来查找哪些记录具有需要更新的字段,因此我们添加了一个只读 DataGrid,他们可以对其进行排序并直观地发现他们感兴趣的记录。接下来他们要选择要编辑的记录脱离网格(但保留组合框)。这就是事情出错的地方。

理想情况下,我们正在寻找的行为是:
  • 如果用户从组合框中选择一条记录:
  • 所选记录以
  • 的形式加载
  • 所选记录在组合框中显示为选中状态。
  • 选中的记录在网格中显示为选中状态。
  • 如果用户在 Grid 中选择一条记录
  • 单击以选择记录。
  • 所选记录以
  • 的形式加载
  • 选中的记录在组合框中显示为选中
  • 选中的记录在网格中显示为选中状态。

  • 最成功的尝试

    DataGrid的SelectionChanged事件触发命令
    <DataGrid x:Name="TheDataGrid"
    ItemsSource="{Binding Source={StaticResource GridRecords}}"
    SelectedItem="DataContext.SelectedRecord, ElementName=LayoutRoot, Mode=OneWay}">
    ...
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
    <i:InvokeCommandAction CommandParameter="{Binding SelectedItem, ElementName=TheDataGrid}"
    Command="{Binding DataContext.SelectRecordFromGridCommand, ElementName=LayoutRoot}"/>
    </i:EventTrigger>
    </i:Interaction.Triggers>

    委托(delegate)命令:

    Public ReadOnly Property SelectRecordFromGridCommand As DelegateCommand(Of TheRecordType) = new DelegateCommand(Of TheRecordType)(Sub(r) SelectedRecord = r)

    尝试了 SelectedItem 的各种选项。绑定(bind)模式。
    如果 DataGrid SelectedItem绑定(bind)被删除,我们得到 1、2、4、5、6 和 7。但是从组合框中选择记录不会显示在网格中选择的记录。

    如果 DataGrid SelectedItem绑定(bind)设置为 OneWay , 通过组合框选择记录中断:设置 SelectedRecord触发 DataGrid 中的 SelectionChanged 事件,该事件使用事件之前的值并有效地将所有内容设置回原始值。

    这可以通过在 ViewModel 中的属性集上引入哨兵来解决。

    Private _selectedRecord As TheRecordType
    Private _enableRecordSelection As Boolean = true
    Public Property SelectedRecord As TheRecordType
    Get
    Return _selectedRecord
    End Get
    Set(value As TheRecordType)
    If _enableRecordSelection
    _enableRecordSelection = false
    SetProperty(_selectedRecord , value)
    _enableRecordSelection = true
    End If
    End Set
    End Property

    这确实有效,我们在写问题时想出了它,但感觉非常糟糕。我的直觉告诉我必须有更好的方法,所以我仍然在问:

    是否有一种干净的(最好仅限 xaml)方法来设置它?

    我们尝试的其他最成功的事情:

    具有双向绑定(bind)的 DataGrid 的直接 xaml 配置
    <DataGrid x:Name="TheDataGrid"
    ItemsSource="{Binding Source={StaticResource GridRecords}}"
    SelectedItem="DataContext.SelectedRecord, ElementName=LayoutRoot, Mode=TwoWay}"/>

    这样,我们就满足了要求 1 到 6;但是,当通过网格选择记录时,始终突出显示上一个记录而不是当前记录。

    DataGrid.InputBindings
    <DataGrid.InputBindings>
    <MouseBinding Gesture="LeftClick"
    CommandParameter="{Binding SelectedItem, ElementName=TheDataGrid}"
    Command="{Binding DataContext.SelectRecordFromGridCommand, ElementName=LayoutRoot}"/>
    </DataGrid.InputBindings>

    没有 SelectedItem绑定(bind),其行为类似于无绑定(bind) InteractionTriggerSelectionChanged ,但它需要用户执行多个鼠标操作。第一次单击选择网格中的行(实际的粗体蓝色选择) 第二次单击触发命令。

    OneWay绑定(bind) SelectedItem ,这与直接的 xaml 配置类似,除了需要多次单击。

    再次重申这个问题:
    有没有比诉诸属性 setter 上的标记值更清洁的方法来完成这 7 个要求?

    最佳答案

    根据您的询问,我了解您想同步 Datagrid 和 ComboBox 中的选定项 .如果我是你,我会使用这两个控件绑定(bind)同一个对象( SelectedRecord )。我只熟悉C#,所以代码是用C#写的。希望它可以帮助你。

    对于 XAML:

    <DataGrid ItemsSource="{Binding Records}"
    SelectedValue="{Binding SelectedRecord}" />
    <ComboBox Grid.Column="1" ItemsSource="{Binding Records}"
    DisplayMemberPath="Id"
    SelectedValue="{Binding SelectedRecord}" />

    对于 ViewModel:
    public ObservableCollection<Record> Records { get; } = new ObservableCollection<Record>();

    public Record SelectedRecord
    {
    get { return _selectedRecord; }
    set
    {
    _selectedRecord = value;
    OnPropertyChanged();
    }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public class Record
    {
    private static int id = 0;
    public Record()
    {
    Id = ++id;
    }

    public int Id { get; set; }
    }

    关于WPF Xaml GridView SelectionChanged 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908178/

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