

VisualStudio2019でC#（.net5）でWPFを作成しています。

画面内でlistViewにチェックボックスやテキストを配置しており、入力できる構造にしています。  
その中で、特定のボタン押下に以下のようにlistView全体の活性/非活性制御を行っています。

[code]

    listView.IsEnabled = false;
    
[/code]

しかし、これを実行するとスクロールまで使えなくなります。  
データ閲覧用にスクロールだけ使えるようになるプロパティなどの指定はできないのでしょうか？（調べた限り見つかりませんでした。）

なにか小技があれば、教えていただきたいです。


CC BY-SA 4.0
2021-07-13T15:45:38.187
78163
2021-07-15T08:19:31.623
2021-07-13T16:20:06.297
3060
47156
question
c# wpf
listView.IsEnabled = false時のスクロール有効方法について


## 方法.1 ItemContainerStyle を設定してその IsEnable を制御する

ListViewItem の有効/無効を切り替えます。  
スクロールはできますが、項目選択や編集ができなくなります。

## 方法.2 GridViewColumn.CellTemplate を設定してコントロール単位で IsEnable を制御する

Cell のコントロールの有効/無効を切り替えます。  
スクロールと項目選択はできますが、編集のみできなくなります。

* * *

以下、実装例になります。

[code]

    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom" HorizontalAlignment="Center" Orientation="Horizontal">
            <CheckBox Content="IsItemEnabled" Margin="10" IsChecked="{Binding IsItemEnabled}"/>
            <CheckBox Content="IsCellEnabled" Margin="10" IsChecked="{Binding IsCellEnabled}"/>
        </StackPanel>
    
        <ListView ItemsSource="{Binding Items}" Margin="10">
    
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="IsEnabled" Value="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.IsItemEnabled}"/>
                </Style>
            </ListView.ItemContainerStyle>
    
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="No." DisplayMemberBinding="{Binding Number}" Width="64" />
                    <GridViewColumn Header="Check">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding IsChecked}" IsEnabled="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.IsCellEnabled}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Name">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Name}" Width="256" IsEnabled="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.IsCellEnabled}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
    
        </ListView>
    </DockPanel>
    
[/code]

[code]

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowViewModel();
        }
    }
    
    
    public class MainWindowViewModel : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Support
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected bool SetProperty<T>(ref T storage, T value, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = null)
        {
            if (Equals(storage, value)) return false;
            storage = value;
            RaisePropertyChanged(propertyName);
            return true;
        }
    
        protected void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    
        #endregion
    
        public List<Person> Items { get; } = Enumerable.Range(0, 1000).Select(e => new Person(e)).ToList();
    
        private bool _isItemEnabled = true;
        public bool IsItemEnabled
        {
            get { return _isItemEnabled; }
            set { SetProperty(ref _isItemEnabled, value); }
        }
    
        private bool _isCellEnabled = true;
        public bool IsCellEnabled
        {
            get { return _isCellEnabled; }
            set { SetProperty(ref _isCellEnabled, value); }
        }
    }
    
    
    public class Person
    {
        public Person(int n)
        {
            this.Number = n;
            this.IsChecked = n % 10 == 0;
            this.Name = $"Name{n:0000}";
        }
    
        public int Number { get; set; }
        public bool IsChecked { get; set; }
        public string Name { get; set; }
    }
    
[/code]


CC BY-SA 4.0
2021-07-15T08:19:31.623
78200
2021-07-15T08:19:31.623
14817
78163
answer