DataGridの列の表示/非表示の切り替え

Category: fx wpf_ja

Question

Watanabe NS on Wed, 06 Jul 2016 13:37:39


DataGridの特定の列の表示/非表示の切替えをチェックボックスとのバインド行いたいです。

作成したコードは下記です。

テスト用の”テスト”列で確認すると”Converter”はうまく動いているようなのですが?

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <CheckBox x:Name="checkBox" Content="削除選択" />

        <DataGrid Name="dataGrid"  Margin="0,21,0,0" AutoGenerateColumns="False">
            <DataGrid.Resources>
                <local:VisiblityConverter x:Key="BoolToVisibility"/>
            </DataGrid.Resources>

            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="削除" Binding="{Binding 削除}" 
                                        Visibility="{Binding ElementName=checkBox ,Path=IsChecked,Converter={StaticResource BoolToVisibility},Mode=OneWayToSource}"/>

                <DataGridTextColumn Header="テスト"    Binding="{Binding ElementName=checkBox ,Path=IsChecked,Converter={StaticResource BoolToVisibility}}" />

                <DataGridTextColumn Header="ID"    Binding="{Binding ID}" />
                <DataGridTextColumn Header="名前"  Binding="{Binding 名前}" />

            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private DataTable tb = new DataTable();
        public MainWindow()
        {
            InitializeComponent();

            var column = new DataColumn("削除", typeof(bool));
            column.DefaultValue = false;
            tb.Columns.Add(column);
            tb.Columns.Add("ID", typeof(int));
            tb.Columns.Add("氏名", typeof(String));

            dataGrid.ItemsSource = tb.DefaultView;
        }
    }

    public class VisiblityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if ((Boolean)value)
                return System.Windows.Visibility.Visible;

            return System.Windows.Visibility.Hidden;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}



Replies

gekka on Wed, 06 Jul 2016 14:18:34


DataGridのDataGridColumnはVisualTreeに登録されないため、DataGridColumnからはElementNameでは探すことができません。
替わりにx:Referenceを使うことができます。

<DataGridCheckBoxColumn Header="削除" Binding="{Binding 削除}"  
    Visibility="{Binding Source={x:Reference checkBox},Path=IsChecked,Converter={StaticResource BoolToVisibility}}"/>
あと、OneWayToSourceがあるとSourceからの変更を受信できないので消します

Watanabe NS on Thu, 07 Jul 2016 00:01:16


gekka様ありがとうございます。

無事に動作するようになりました。

ElementNameで指定できるかは、”VisualTree”への登録の有無なのですね。
勉強になりました。