0

私は現在、コードが次のようなトグルボタンを含む3列のデータグリッドを含むWPFアプリケーションに取り組んでいます

<DataGridTemplateColumn Header="Closed" Width="60">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ToggleButton>
                <ToggleButton.Content>
                    ...
                </ToggleButton.Content>
            </ToggleButton>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Checked" Width="60">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
                <ToggleButton Visibility="{Binding Path=IsClosedProperty, Converter={StaticResource toggleButtonVisibilityConverter}}">
                        <ToggleButton.Content>
                            ...
                        </ToggleButton.Content>
                </ToggleButton>
            </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Active" Width="60">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ToggleButton Visibility="{Binding Path=IsCheckedProperty, Converter={StaticResource toggleButtonVisibilityConverter}}">
                <ToggleButton.Content>
                    ...
                </ToggleButton.Content>
            </ToggleButton>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

toggleButtonVisibilityConverter のコードは次のとおりです。

public class ToggleButtonVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value is bool && ((bool)value) ? Visibility.Visible : Visibility.Hidden;
    }

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

アプリケーションは、列の行Closedの ToggleButton がクリックされると、Checkedその行の列の ToggleButton が表示される (つまり、toggleButtonVisibilityConverter呼び出される) ように動作する必要があります。また、列の行Checkedの ToggleButton をクリックすると、Activeその行の列の ToggleButton が表示されます。また、それぞれの ToggleButton をクリックしないと、同じ階層で非表示になります。

IsClosedPropertyとは ViewModelのIsCheckedPropertyブール型プロパティで、ClosedCheckedtoggleButtons がそれぞれクリックされたときに true に設定されます。

4

2 に答える 2

1

データを保持するクラス

public class GridToggleButtonItem
{
    private bool _isClosedProperty;

    public bool IsClosedProperty
    {
        get { return _isClosedProperty; }
        set { _isClosedProperty = value; }
    }

    private bool _isCheckedProperty;

    public bool IsCheckedProperty
    {
        get { return _isCheckedProperty; }
        set { _isCheckedProperty = value; }
    }
}

データグリッドにバインドされるアイテム コレクションを持つ ViewModel

public class GridToggleButtonViewModel
{
    public List<GridToggleButtonItem> Items { get; set; }

    public GridToggleButtonViewModel()
    {
        Items = new List<GridToggleButtonItem>()
        {
            new GridToggleButtonItem() { IsCheckedProperty = false, IsClosedProperty = false},
            new GridToggleButtonItem() { IsCheckedProperty = false, IsClosedProperty = false},
            new GridToggleButtonItem() { IsCheckedProperty = false, IsClosedProperty = false},
            new GridToggleButtonItem() { IsCheckedProperty = false, IsClosedProperty = false},
            new GridToggleButtonItem() { IsCheckedProperty = false, IsClosedProperty = false}
        };
    }
}

ビューモデルにバインドする XAML コード

<Window x:Class="StackOverFlowQ.GridToggleButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:StackOverFlowQ"
    Title="GridToggleButton" Height="500" Width="500">
<Window.DataContext>
    <local:GridToggleButtonViewModel></local:GridToggleButtonViewModel>
</Window.DataContext>
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"></BooleanToVisibilityConverter>

    <Style TargetType="{x:Type ToggleButton}">
        <Setter Property="Margin" Value="3"></Setter>            
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="FontWeight" Value="Bold"></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <DataGrid ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="Cell" CanUserAddRows="False" >
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Closed" Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ToggleButton Content="Closed" IsChecked="{Binding Path=IsClosedProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ToggleButton>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Checked" Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ToggleButton Content="Checked" Visibility="{Binding Path=IsClosedProperty, Converter={StaticResource ResourceKey=BooleanToVisibilityConverter}}" IsChecked="{Binding Path=IsCheckedProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ToggleButton>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Active" Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ToggleButton Content="Active" Visibility="{Binding Path=IsCheckedProperty, Converter={StaticResource ResourceKey=BooleanToVisibilityConverter}}"></ToggleButton>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>

于 2013-09-21T06:50:44.030 に答える