2015-03-20 7 views
0

У меня есть элемент управления вкладкой, привязанный к наблюдаемой коллекции. На каждой вкладке отображается одна группа переключателей. Когда вкладка изменена, по какой-то причине она отменяет выбор выбранного переключателя.Выбранный переключатель изменяется при изменении выбранной вкладки

Каждый элемент в наблюдаемой коллекции сохраняет выбранный переключатель для своей вкладки. Я считаю, что это означает, что они не могут вмешиваться друг в друга. Я также признаю, что для каждой группы может быть выбран только один переключатель. Тем не менее, каждая вкладка находится в собственной группе. Почему выбранный переключатель изменяется при изменении вкладки?

XAML

<TabControl x:Name="MainTabControl" > 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding TabName}"></TextBlock> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="1*" /> 
        <ColumnDefinition Width="1*" /> 
        <ColumnDefinition Width="1*" /> 
       </Grid.ColumnDefinitions> 
       <RadioButton x:Name="RadioButtonX" 
          Grid.Column="0" 
          VerticalAlignment="Center" 
          Content="X" 
          IsChecked="{Binding XChecked}" /> 
       <RadioButton x:Name="RadioButtonY" 
          Grid.Column="1" 
          VerticalAlignment="Center" 
          Content="Y" 
          IsChecked="{Binding YChecked}" /> 
       <RadioButton x:Name="RadioButtonZ" 
          Grid.Column="2" 
          VerticalAlignment="Center" 
          Content="Z" 
          IsChecked="{Binding ZChecked}" /> 
      </Grid> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

C#

public partial class MainWindow 
{ 
    public ObservableCollection<RadioButtonSettings> listOfButtonSettings { get; set; } 

    public MainWindow() 
    { 
     listOfButtonSettings = new ObservableCollection<RadioButtonSettings> 
     { 
      new RadioButtonSettings {TabName = "tab1"}, 
      new RadioButtonSettings {TabName = "tab2"}, 
      new RadioButtonSettings {TabName = "tab3"} 
     }; 

     InitializeComponent(); 
     MainTabControl.ItemsSource = listOfButtonSettings; 
    } 
} 

public class RadioButtonSettings 
{ 
    public string TabName { get; set; } 
    public bool XChecked { get; set; } 
    public bool YChecked { get; set; } 
    public bool ZChecked { get; set; } 

    public RadioButtonSettings() 
    { 
     XChecked = true; 
    } 
} 

ответ

1

Эта проблема описана here

Для устранения этой проблемы использовать класс RadioButtonExtended как написано в ссылке выше. Затем вы можете изменить свой XAML следующим образом:

<RadioButtonExtended x:Name="RadioButtonX" 
    Grid.Column="0" 
    VerticalAlignment="Center" 
    Content="X" 
    IsCheckedReal="{Binding XChecked}" /> 
<RadioButtonExtended x:Name="RadioButtonY" 
    Grid.Column="1" 
    VerticalAlignment="Center" 
    Content="Y" 
    IsCheckedReal="{Binding YChecked}" /> 
<RadioButtonExtended x:Name="RadioButtonZ" 
    Grid.Column="2" 
    VerticalAlignment="Center" 
    Content="Z" 
    IsCheckedReal="{Binding ZChecked}" /> 
+0

Не могу сказать, что я слишком согласен с наследованием. Это может быть разрешено в модели представления, заставив RadioButtonSettings реализовать INotifyPropetyChanged и отменить другие свойства, когда свойство «проверено». Используйте MVVM в своих интересах и управляйте логикой в ​​виртуальной машине –

-1

Я могу сказать, что имена переключателей одинаковы для каждой вкладки. Итак, когда вы устанавливаете Y на tab2, X будет отмечен на tab2, но поскольку он имеет то же имя на tab1, будет также снят флажок! Кроме того, если вы выберете на вкладке 1 флажок Y, когда вы измените вкладку, Y будет автоматически снят, потому что на каждой вкладке сначала выбирается X!

Вам нужно уникальное имя для ваших флажков. Но, насколько я знаю, нет способа привязать имя к свойству. В заключение, мое личное мнение состоит в том, что вам нужно создать отдельный элемент управления вкладкой отдельно и предоставить уникальные имена для флажков.

Надеюсь, это поможет!

+0

Как вы можете видеть в моем вопросе, мои переключатели создаются внутри DataTemplate. Я не могу давать уникальные имена каждому флажку. – Brandon