WPF Microsoft DataGrid имеет странное поведение «IsReadOnly». Почему?

Можно использовать только один DataGrid.

Но в моем примере кода я установил флажок (в верхнем левом углу окна) для переключения состояния свойства ReadOnly DataGrids, находящегося в элементах ListView. Состояние ReadOnly для ListView DataGrids меняется, но есть побочные эффекты:

  • DataGrid, определенный до ListBox, также меняет свое состояние ReadOnly.
  • DataGrids, которые определены в ListBox, также следуют за состоянием свойства ReadOnly Datagrids, определенного в ListView.

Обновлено после того, как люди сказали о дубликате: Просто чтобы люди знали. Проблема возникает из-за использования того же ItemsSource. Тот же CollectionView будет использоваться под капотом. Все функции, связанные с CollectionView, например порядок сортировки или свойство IsReadOnly, будут затронуты для каждого элемента управления, имеющего один и тот же ItemsSource (тот же CollectionView под капотом).

Почему?

Чтобы воспроизвести проблему ... Просто сделайте обычное приложение WPF и примените 2 модификации:

  1. Измените MainWindow xaml на:

    <ScrollViewer>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height  = "Auto"></RowDefinition>
                <RowDefinition Height  = "Auto"></RowDefinition>
                <RowDefinition Height  = "Auto"></RowDefinition>
                <RowDefinition Height  = "Auto"></RowDefinition>
                <RowDefinition Height  = "Auto"></RowDefinition>
                <RowDefinition Height  = "Auto"></RowDefinition>
            </Grid.RowDefinitions>
    
            <CheckBox Name = "CheckBox"></CheckBox>
    
            <TextBlock Grid.Row = "1" Text = "{Binding Families.Count}"></TextBlock>
            <!--<Button Click = "ButtonBase_OnClick"></Button>-->
    
            <DataGrid Grid.Row = "2" ItemsSource = "{Binding Familiy1.Persons}"
                    IsReadOnly = "True">
            </DataGrid>
    
            <DataGrid Grid.Row = "3" ItemsSource = "{Binding Familiy1.Persons}"
                    IsReadOnly = "false">
            </DataGrid>
    
            <ListBox Grid.Row = "4" HorizontalContentAlignment = "Stretch" 
                    ScrollViewer.HorizontalScrollBarVisibility = "Disabled" 
                    ItemsSource = "{Binding Families}" Background = "Khaki">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <GroupBox Header = "ListBox">
                            <DataGrid ItemsSource = "{Binding Persons}">
                            </DataGrid>
                        </GroupBox>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    
            <ListView Grid.Row = "5" 
                    ItemsSource = "{Binding Families}"
                    Margin = "0,24,0,0" Background = "Thistle"
                    ScrollViewer.HorizontalScrollBarVisibility = "Disabled">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <GroupBox>
                            <GroupBox.Header>
                                <TextBlock Text = "ListView"></TextBlock>
                            </GroupBox.Header>
    
                            <DataGrid ItemsSource = "{Binding Persons}"
                                    Background = "Red" AutoGenerateColumns = "True"
                                    ColumnWidth = "Auto"
                                      IsReadOnly = "{Binding IsChecked , ElementName=CheckBox}">
                            </DataGrid>
                        </GroupBox>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </ScrollViewer>
    

  2. Также добавьте следующий класс MainWindowModel.cs:

    using System.Collections.ObjectModel;
    using System.ComponentModel;
    
    
    namespace WpfDataGridIsReadOnlyBug
    { 
    public class Person : INotifyPropertyChanged
    {
        private int _age;
        private string _name;
    
        public string Name
        {
            get { return _name; }
            set { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); }
        }
    
        public int Age
        {
            get { return _age; }
            set { _age = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Age")); }
        }
    
        public Person()
        {
    
        }
    
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    
    public class Family : INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); }
        }
    
        public Family()
        {
    
        }
    
        public Family(string name)
        {
            Name = name;
        }
        public ObservableCollection<Person> Persons { get; } = new ObservableCollection<Person>();
    
        public event PropertyChangedEventHandler PropertyChanged;
    
    }
    
    public class MainWindowModel
    {
        public ObservableCollection<Family> Families { get; } = new ObservableCollection<Family>();
    
        public Family Familiy1
        {
            get { return Families[0]; }
        }
    
        public MainWindowModel()
        {
            Family family = new Family("Family 1");
            family.Persons.Add(new Person("Eric", 50));
            family.Persons.Add(new Person("Isabel Lucas", 35));
            Families.Add(family);
    
            family = new Family("Family 2");
            family.Persons.Add(new Person("Candice Swanopel", 25));
            Families.Add(family);
        }
    }
    }
    

Спасибо человеку, нашедшему оригинальный вопрос с хорошим ответом!

Eric Ouellet 01.05.2018 18:51

Обратите внимание, что для меня это ошибка !!!

Eric Ouellet 01.05.2018 18:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
43
0

Другие вопросы по теме

Похожие вопросы

Как вернуть объекты, обновив несколько свойств в запросе linq, который использует JOIN
Страница входа в систему параметризованного запроса SQL
Создание документа Word (docx) с использованием данных из файла XML / Преобразование XML в документ Word на основе шаблона
Mvc Razor Список и редактирование в одном представлении с кнопкой отправки для каждого элемента списка
Странное воспроизводимое поведение при удалении - символы удаляются некорректно
Реализация интерфейса C# .NET на нескольких уровнях
Возможно ли (невозможно) использовать настраиваемый элемент управления WPF так же, как его базовый класс (в данном случае StackPanel) в XAML?
Регулярное выражение для соответствия сложному предложению Where для таблицы Certian
Прекращает ли установка IsAccessible значение false при нажатии кнопки или пропускает кодирование?
Как получить выбранное значение combobox для перехода в базу данных