Пользовательские элементы управления WPF на отдельных вкладках: почему имя группы радиокнопок является общим для вкладок? - PullRequest
10 голосов
/ 20 мая 2010

Я использую вкладку WPF для представления отдельных повторяющихся экземпляров пользовательского элемента управления. то есть Tab1 для настроек Item1, Tab2 для настроек Item2 и т. д.

Похоже, что имена групп переключателей распределяются между вкладками. Что происходит?

Простой пример:

Окно содержит вкладки. Каждая вкладка содержит пользовательский элемент управления.

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lib="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Grid>
    <TabControl Margin="0,0,0,100" Name="tabControl1">
        <TabItem Header="tabItem1" Name="tabItem1">
            <lib:UserControl1 x:Name="userControlInTab1" />
        </TabItem>
        <TabItem Header="tabItem2" Name="tabItem2">
            <lib:UserControl1 x:Name="userControlInTab2" />
        </TabItem>
    </TabControl>
</Grid>

Пользовательский элемент управления - это просто две радиокнопки в группе:

<UserControl x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="50" Width="100">
<StackPanel>
    <RadioButton GroupName="Group1" Name="radiobutton1" Content="option1" IsChecked="True" />
    <RadioButton GroupName="Group1" Name="radiobutton2" Content="option2" />
</StackPanel>

Если вы запустите это приложение, вы увидите, что проверяется только radiobutton1 на второй вкладке, несмотря на то, что usercontrol определяет его для проверки при запуске.

Кроме того, установка радиокнопки, как отмечено в коде, похоже, снимает флажки со всех радиокнопок в других вкладках!

Кажется, что все работает хорошо под управлением мыши (т.е. вкладки независимы).

Наконец, пользовательские элементы управления кажутся отдельными экземплярами. Я пробовал это с ползунками на пользовательских элементах управления, например, и они ведут себя независимо на разных вкладках. Как они должны.

Спасибо за любую помощь в этом. Я искал широко безрезультатно. Конечно, я не единственный человек, который имел эту проблему. Я использую VS2008.

Ответы [ 3 ]

16 голосов
/ 20 мая 2010

Без установленного GroupName это работает. Это не является строго необходимым, так как RadioButton в одном контейнере автоматически сгруппированы в любом случае. Например:

<UserControl x:Class="WpfApplication1.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="50" Width="100">
    <StackPanel>
        <StackPanel>
            <RadioButton  Name="radiobutton1" Content="option1" IsChecked="True" />
            <RadioButton  Name="radiobutton2" Content="option2" />
        </StackPanel>
        <StackPanel>
            <RadioButton  Name="radiobutton3" Content="option3" IsChecked="True" />
            <RadioButton  Name="radiobutton4" Content="option4" />
        </StackPanel>
    </StackPanel>
</UserControl>
5 голосов
/ 25 июня 2013

Такое поведение предусмотрено:

весь смысл GroupName в том, чтобы позволить вам определять переключатели которые действуют как группа без необходимости быть одним и тем же родителем панель.

Пожалуйста, прочитайте эту статью для подробного объяснения.

Если говорить кратко, есть два решения для двух разных случаев:

  • Если у вас есть все логически связанные переключатели в одном контейнере, тогда не указывает GroupName . В этом случае переключатели автоматически образуют группу, независимую от других групп переключателей.

  • Если вы разделите логически связанные переключатели между несколькими панелями для макета, тогда прочитайте статью для подробного объяснения, что делать.

0 голосов
/ 09 апреля 2014

У меня была ситуация, когда конструкция не позволяла разделить радиостанции на отдельные стеки. Итак, я удалил GroupName из xaml и навязал группировку из модели. Эта идея пришла от этой ссылки , например

private bool _useGaugeOpen;
public bool UseGaugeOpen
{
    get { return _useGaugeOpen; }
    set
    {
        _useGaugeOpen = value;
        _useATGOpen = !value;
        RaisePropertyChanged("UseATGOpen");            
    }
}
private bool _useATGOpen;
public bool UseATGOpen
{
    get { return _useATGOpen; }
    set
    {
         _useATGOpen = value;
         _useGaugeOpen = !value;
         RaisePropertyChanged("UseGaugeOpen");
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...