【问题标题】:WPF Databound RadioButton ListBoxWPF 数据绑定单选按钮列表框
【发布时间】:2019-11-08 00:04:29
【问题描述】:

我在 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;

它们静默失败——没有抛出异常,但 UI 不显示被选中的项目。

【问题讨论】:

    标签: wpf listbox radio-button databound


    【解决方案1】:

    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}" />
    

    【讨论】:

      【解决方案2】:

      我会在 RadioButton 绑定中启用 NotifyOnSourceUpdated。即使您允许双向绑定(这是默认设置),也不会从代码隐藏更改中获取通知,除非您明确监听它们。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        相关资源
        最近更新 更多