WPF Databound RadioButton ListBox - PullRequest
       17

WPF Databound RadioButton ListBox

0 голосов
/ 04 февраля 2010

У меня проблемы с получением списка радиокнопок с привязкой к данным в WPF, чтобы реагировать на ввод пользователя и отражать изменения данных, с которыми он связан (т. Е. Вносить изменения в код). Пользовательская сторона ввода работает нормально (то есть, я могу выбрать радиокнопку, и список ведет себя как положено). Но каждая попытка изменить выбор в коде терпит неудачу. Тихо (т.е. не исключение).

Вот соответствующий раздел XAML (я думаю):

<Setter Property="ItemContainerStyle">
<Setter.Value>
    <Style TargetType="{x:Type ListBoxItem}" >
        <Setter Property="Margin" Value="2" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border Name="theBorder" Background="Transparent">
                    <RadioButton Focusable="False" IsHitTestVisible="False" 
                        IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" >
                        <ContentPresenter />
                    </RadioButton>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Setter.Value>

Я связываю список со списком объектов SchoolInfo. SchoolInfo содержит свойство IsSelected:

    public bool IsSelected
    {
        get { return isSelected; }

        set
        {
            if( value != isSelected )
            {
                isSelected = value;
                this.OnPropertyChanged("IsSelected");
            }
        }
    }

Материал OnPropertyChanged () был чем-то, что я добавил во время своих экспериментов. Это не решает проблему.

Вещи, подобные следующим, терпят неудачу:

((SchoolInfo) lbxSchool.Items[1]).IsSelected = true;
lbxSchool.SelectedIndex = 1;

Они молча терпят неудачу - исключение не выдается, но пользовательский интерфейс не показывает выбранный элемент.

  • Mark

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

RadioButton привязывается к свойству ListBoxItem IsSelected, а не к вашему свойству SchoolInfo IsSelected.

(Это сбивает с толку, поскольку ListBoxItem имеет свойство IsSelected, также как и объект SchoolInfo, поэтому не было ошибок привязки).

Чтобы исправить, ListBoxItem.IsSelected должен быть привязан к вашему свойству SchoolInfo IsSelected.

т.е. Вам потребуется дополнительный установщик для ListBoxItem для привязки к SchoolInfo.IsSelected, и тогда элемент списка будет работать как надо, а также RadioButton может правильно связываться с ListBoxItem.IsSelected.

<Style TargetType="{x:Type ListBoxItem}" >
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
0 голосов
/ 04 февраля 2010

Я бы включил NotifyOnSourceUpdated в привязке вашего RadioButton. Даже если вы разрешаете двустороннюю привязку (которая используется по умолчанию), уведомления не будут приниматься из-за изменений кода, если вы их явно не слушаете.

<RadioButton Focusable="False" IsHitTestVisible="False" 
                    IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, NotifyOnSourceUpdated=True}" >
...