0

「MVVM Group Radio Button」に対するgehhoの回答に続いて、リスト項目が選択されたときにラジオボタンがチェックされ、リスト項目が選択されていないときにラジオボタンがチェックされないように、リスト項目にラジオボタンを追加しようとしています. Kelly は、 「RadioButton IsChecked を ListBoxItem IsSelected および ListBox IsFocused にバインドする」という質問に対して、私が必要とすることを行うべきだと思われる素晴らしい回答を持っています。ただし、Kelly の XAML の単純な転置は機能しません。ラジオ ボタンはオフのままです。ここに私の MainWindow.xaml の全体があります

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.SampleDataSource" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="RadioButton.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">

    <Window.Resources>
        <SampleData:SampleDataSource x:Key="SampleDataSource" d:IsDataSource="True"/>
        <ControlTemplate x:Key="LBItemControlTemplate" TargetType="{x:Type ListBoxItem}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock TextWrapping="Wrap" Text="{Binding Property1}" Grid.Column="1"/>
                <RadioButton x:Name="rbIsSelected" IsChecked="False" IsEnabled="False"/>
            </Grid>
            <ControlTemplate.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsSelected" Value="True"/>
                        <Condition Property="Selector.IsSelectionActive" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="IsChecked" TargetName="rbIsSelected" Value="True"/>
                </MultiTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
        <DataTemplate x:Key="ListBoxItemTemplate">
            <ListBoxItem Template="{StaticResource LBItemControlTemplate}"/>
        </DataTemplate>
    </Window.Resources>

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
        <ListBox ItemsSource="{Binding Collection}" ItemTemplate="{DynamicResource ListBoxItemTemplate}" SelectionMode="Single"/>
    </Grid>
</Window>

これがうまくいかない理由を誰かが見て、修正または別のアプローチを提案できますか?

4

1 に答える 1

1

ItemsControlsが、見つかったすべてのデータ項目に対してコンテナ項目を自動的に作成することをご存知ですか? あなたには決して正しくないDataTemplatea が含まれています。ListBoxItemあなたは基本的に「私のコンテンツをListBoxItemに表示するときは、新しいListBoxItemを作成してください」と言います。したがって、コードは detached に依存していますListBoxItemが、これは決して選択できません。これは、のコンテナ項目ではないため、機能しませItemsControlん。あなたDataTemplateはコンテナ内のコンテンツにすぎません。この場合、DataTemplate はデータが .xml でどのように見えるかを定義する必要がありますListBoxItem

これは小さな例ですが、必ずしも良い例ではありませんが、 を作成する必要がないことを示しています。ListBoxItem自動的に存在します:

たとえば、Window.Resources または app.xaml などのリソースとしての場所:

<DataTemplate x:Key="myTemplate">
    <StackPanel Orientation="Horizontal">
        <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"/>
        <TextBlock Text="{Binding}"/>
    </StackPanel>
</DataTemplate>

そして使い方自体

<ListBox x:Name="test" ItemTemplate="{StaticResource myTemplate}"/>

この場合のリストボックスは、分離コードで設定された ItemsSource を取得する必要があります。

于 2013-04-10T12:15:20.643 に答える