4

この動作は既知のものだと確信していますが、Google で検索することはできません。私は次のコードを持っています:

<Window x:Class="ContentControlListDataTemplateKacke.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <TabControl ItemsSource="{Binding Items}">
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Label Content="{Binding Name}" />
                        <RadioButton Content="Option1" IsChecked="{Binding Option1}" />
                        <RadioButton Content="Option2" IsChecked="{Binding Option2}" />
                    </StackPanel>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </DockPanel>
</Window>

コード ビハインドは単純です。

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
}

ビューモデルは次のようになります。

public class ViewModel : NotificationObject
{
    public ViewModel()
    {
        Items = new ObservableCollection<Item>
        {
            new Item {Name = "1", Option1 = true},
            new Item {Name = "2", Option2 = true}
        };
    }

    public ObservableCollection<Item> Items { get; set; }
}

そして、このようなアイテム:

public class Item : NotificationObject
{
    public string Name { get; set; }

    private bool _option1;
    public bool Option1
    {
        get { return _option1; }
        set
        {
            _option1 = value;
            RaisePropertyChanged(() => Option1);
        }
    }

    private bool _option2;
    public bool Option2
    {
        get { return _option2; }
        set
        {
            _option2 = value;
            RaisePropertyChanged(() => Option2);
        }
    }
}

Prism を使用しているため、RaisePropertyChanged は PropertyChanged イベントを発生させます。2 番目のタブを選択し、次に最初のタブを選択し、次に 2 番目のタブをもう一度選択すると、ほら、2 番目のタブの RadioButtons が選択解除されます。

なんで?

Rachels 以外の別のソリューション

私の同僚は、RadioButtons の GroupName プロパティを各項目の一意の文字列にバインドするというアイデアを思いつきました。RadioButtons の宣言を次のように変更するだけです。

<RadioButton GroupName="{Binding Name}" Content="Option1" IsChecked="{Binding Option1}" />
<RadioButton GroupName="{Binding Name}" Content="Option2" IsChecked="{Binding Option2}" />

そして、 Name-property がすべてのアイテムに対して一意である場合に機能します(私の問題の場合)。

4

2 に答える 2

1

WPF は、すべての RadioButton を同じグループの一部として読み取ります。ラジオ ボタン グループでは、一度に 1 つの項目しか選択できません。

読み込み順序は次のとおりです。

  • Tab1 をロード
  • Tab1.Radio1 を読み込みます。IsChecked = True
  • Tab1.Radio2 を読み込みます。IsChecked = True なので、Tab1.Radio2.IsChecked = False に設定します

  • タブ 2 をクリックします。

  • Tab2 をロード
  • Tab2.Radio1 を読み込みます。IsChecked = True なので、Tab1.Radio2.IsChecked = False に設定します
  • Tab2.Radio2 をロードします。IsChecked = True なので、Tab2.Radio1.IsChecked = False に設定します

  • ここまでで、Tab2.Radio2 だけがチェックされ、他のすべてのラジオは読み込まれてチェックが解除されたので、それらの DataBound 値は false に更新されました。

  • タブ 1 をクリックします。

  • Tab1.Radio1 を読み込みます。IsChecked = False
  • Tab1.Radio2 を読み込みます。IsChecked = False

ラジオボタンに関連性がなく、両方を一度にチェックできる場合は、に切り替えることをお勧めしますCheckBoxes

それらがグループ化されることを意図していて、一度に1つのアイテムしか選択できない場合は、でListBox描画されたに切り替えて、あなたのにRadioButtonsのみ保存することをお勧めSelectedOptionしますViewModel

そのために私が通常使用するスタイルは次のとおりです。

<Style x:Key="RadioButtonListBoxStyle" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2, 2, 2, 0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border Background="Transparent">
                                <RadioButton
                                    Content="{TemplateBinding ContentPresenter.Content}" VerticalAlignment="Center"
                                    IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>

                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

次のように使用されます。

<ListBox ItemsSource="{Binding Options}"
         SelectedValue="{Binding SelectedValue}"
         Style="{StaticResource RadioButtonListBoxStyle}" />
于 2012-07-18T17:06:35.837 に答える
0

ビューを切り替えるときにテキストがクリアされるという、これと非常によく似た問題がありました。私が正しく思い出せば、次の解決策がうまくいきました。

  • プロパティにバインドOneWayし、これらのバインドされたプロパティを属性でマークします。
  • ビュー (およびビューモデル) をロードするたびに、前述の属性でリフレクションを使用して、バインドされたプロパティを見つけます。
  • PropertyChangedビューを正しく更新するには、プロパティごとにイベントを発生させます。

これは、ビューがデフォルト設定でロードされ、何もイベントが発生していないため、ロード時にプロパティをクエリしていないことが原因だと思いますPropertyChanged

また、それはあなたの質問の一部ではありませんが、Visual Studio が明示的なコードビハインド ファイルを持つ必要がないように、(Window の DataContext プロパティを介して) XAML でデータ コンテキストを直接設定できます。

于 2012-07-18T15:33:00.973 に答える