Можно использовать только один DataGrid.
Но в моем примере кода я установил флажок (в верхнем левом углу окна) для переключения состояния свойства ReadOnly DataGrids, находящегося в элементах ListView. Состояние ReadOnly для ListView DataGrids меняется, но есть побочные эффекты:
Обновлено после того, как люди сказали о дубликате: Просто чтобы люди знали. Проблема возникает из-за использования того же ItemsSource. Тот же CollectionView будет использоваться под капотом. Все функции, связанные с CollectionView, например порядок сортировки или свойство IsReadOnly, будут затронуты для каждого элемента управления, имеющего один и тот же ItemsSource (тот же CollectionView под капотом).
Почему?
Чтобы воспроизвести проблему ... Просто сделайте обычное приложение WPF и примените 2 модификации:
Измените 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>
Также добавьте следующий класс 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);
}
}
}
Обратите внимание, что для меня это ошибка !!!
Спасибо человеку, нашедшему оригинальный вопрос с хорошим ответом!