この動作は既知のものだと確信していますが、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 がすべてのアイテムに対して一意である場合に機能します(私の問題の場合)。