RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1162078
Accepted
borik
borik
Asked:2020-08-04 23:00:54 +0000 UTC2020-08-04 23:00:54 +0000 UTC 2020-08-04 23:00:54 +0000 UTC

WPF 数据网格,DataGridCheckBoxColumn 单元格依赖于 DataGridComboBoxColumn

  • 772

有一个数据网格,它由 2 列组成:第一列是包含元素 1、2、3 的下拉列表;第二个是复选框。如果在下拉列表中选择了 1,如何设置复选框 isEnable = False

wpf
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    EvgeniyZ
    2020-08-05T22:23:49Z2020-08-05T22:23:49Z

    事实上,这个任务非常简单,这里的一切都取决于你的应用程序的制作能力、绑定的使用等等。

    如果记住,那么应该有一个单独的类,它将包含有关表中一行的信息,如下所示:

    public class Item : NotifyBase
    {
        public List<int> Items { get; } = new List<int> { 1, 2, 3 };
    
        private int selectedItem;
        public int SelectedItem
        {
            get => selectedItem;
            set
            {
                IsEnabled = value != 1;
                selectedItem = value;
            }
        }
    
        private bool isEnabled = true;
        public bool IsEnabled 
        {
            get => isEnabled;
            set => SetField(ref isEnabled, value);
        }
        public bool IsSelected { get; set; }
    }
    

    这是一个非常简化的视图,这里有一些细微差别,但举个例子来说它就可以了。我想您理解逻辑,我们有一些属性SelectedItem,每次在it),然后我们可以稍微重写,在其中指示检查新值的最简单逻辑。 由于属性从代码中更改(我正在谈论),因此我们需要告诉接口它,通知它,并且出于这些目的,有,它在所需的属性中被调用。实现本身是不同的,我使用这个:ComboBoxgetsetset
    IsEnabled = ...INotifyPropertyChangedsetINotifyPropertyChanged

    public class NotifyBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler? PropertyChanged;
        protected void OnPropertyChanged(string? propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
        protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
        {
            if (EqualityComparer<T>.Default.Equals(field, value)) return false;
            field = value;
            OnPropertyChanged(propertyName);
            return true;
        }
    }
    

    实际上,这就是解决像您这样的问题所需要的一切。剩下的只是为绑定创建一个集合,设置DataContextXAML 将从哪个接收数据,并编写一个简单的接口。
    我会将所有内容都写在窗口中,但我建议您为此目的单独创建一个类,窗口应该是干净的!

    public partial class MainWindow : Window
    {
        public List<Item> Items { get; } = new List<Item>
        {
            new Item(),
            new Item(),
            new Item(),
            new Item(),
            new Item(),
        };
    
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }
    }
    

    好吧,XAML:

    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Значение" >
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Items}" />
                        <Setter Property="SelectedItem" Value="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" />
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Items}" />
                        <Setter Property="SelectedItem" Value="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
            <DataGridCheckBoxColumn Header="Выбрано">
                <DataGridCheckBoxColumn.ElementStyle>
                    <Style TargetType="CheckBox">
                        <Setter Property="IsChecked" Value="{Binding IsSelected}"/>
                        <Setter Property="IsEnabled"  Value="{Binding IsEnabled}"/>
                    </Style>
                </DataGridCheckBoxColumn.ElementStyle>
            </DataGridCheckBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    我讨厌这个组件,它让我写了很多不必要的东西,所以如果你知道如何做得更好,那就去吧,我只是快速地写了它。
    这里一切都很简单,我们制作一个表格,将其绑定到一个Items属性,好吧,我们制作两列,第一列显示数字列表,第二列是CheckBox.

    我们启动并看到我们的逻辑已成功运行

    结果

    如您所见,一切都很简单,祝您学习顺利!

    • 1

相关问题

  • 基于数据的 WPF ItemsControl 模板

  • 转换器的问题

  • 在哪里可以查看可在 XAML 中使用的所有可用 WIRED 命名空间?

  • MVVM 数据收集的问题

  • 按钮样式。WPF

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5