【问题标题】:WPF RadioButton known issue: why the old property value seems still binding after property changedWPF RadioButton 已知问题:为什么旧的属性值在属性更改后似乎仍然具有约束力
【发布时间】:2013-12-22 07:16:30
【问题描述】:

谢谢。我希望我可以上传整个解决方案,因为我在打开这个问题之前已经准备好了。但我没有找到如何。我将尽可能复制所有代码。

问题是:我认为这是 WPF 中一个容易复制的问题。 我做了一个简单的代码版本来清楚地解释我的问题。这 示例中的容器“TwoPersons”有两个类实例 '人'。 “当前”属性将是详细信息的数据上下文 填充人员详细信息的面板。我可以使用当前设置器 在不同的人之间跳转的方法。我可以看到细节 相应地改变。问题是在切换和 填充当前人,UI 控件更改(例如将男性更改为 女性),然后更改会影响它绑定的上一个项目。这 persion 实例将被意外修改。好像以前 绑定新实例后,实例仍然与视图有联系。 我怎样才能避免这种情况。任何帮助将不胜感激。

================================================ ==========================

这是 MainWindow.xaml.cs

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    TwoPersons twoPersons = new TwoPersons();
    public MainWindow()
    {
        InitializeComponent();
        DataContext = twoPersons;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        twoPersons.Next();
    }
}

两个人的容器:

public class TwoPersons : INotifyPropertyChanged
{
    Person p1 = new Person("Mary") { IsFemale = true };
    Person p2 = new Person("Luis") { IsMale = true };

    Person current;

    public Person Current
    {
        get
        {
            if (current == null)
                current = p1;

            return current;
        }

        set
        {
            if (current != value)
            {
                current = value;
                OnPropertyChanged("Current");
            }
        }
    }

    public void Next()
    {
        Current = Current == p1 ? p2 : p1;
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
            PropertyChanged(this, e);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

人物类:

public class Person : INotifyPropertyChanged
{
    public Person(string name)
    {
        this.name = name;
    }

    private string name;
    public string Name
    {
        get { return name; }
    }

    public bool isMale;
    public bool IsMale
    {
        get { return isMale; }
        set
        {
            if (isMale != value)
            {
                isMale = value;
                OnPropertyChanged("IsMale");
                OnPropertyChanged("IsFemale");
                OnPropertyChanged("Description");
            }
        }
    }

    public bool IsFemale
    {
        get { return !isMale; }
        set { IsMale = !value; }
    }

    public string Description
    {
        get
        {
            return isMale ? "Male" : "Female";
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
            PropertyChanged(this, e);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

主窗口 xaml

<Grid>
    <StackPanel DataContext="{Binding Current}">
        <TextBlock Text="{Binding Name}"></TextBlock>
        <RadioButton IsChecked="{Binding IsMale}">Male</RadioButton>
        <RadioButton IsChecked="{Binding IsFemale}">Female</RadioButton>
        <TextBlock Text="{Binding Description}"></TextBlock>
        <Button Click="Button_Click" Height="32">Next >></Button>
        <TextBlock>Note. Mary should be alway a female! But it changes when navigating by clicking the button above </TextBlock>
    </StackPanel>
</Grid>

【问题讨论】:

  • 您的问题不够清楚,哪个绑定没有按预期工作?
  • 是的,很难理解到底哪里出了问题。允许重现问题的 XAML 将是最好的。
  • @Somedust... 尝试向下滚动以查看 XAML。
  • 我的错,没有引起足够的重视。
  • 尝试在示例中编写代码,是的,问题存在。此外,丢失值的总是第二个RadioButton

标签: wpf data-binding radio-button 2-way-object-databinding


【解决方案1】:

当您向 StackOverflow 提出问题时,您确实应该提供所有重现问题所需的代码。您应该这样做的第一个原因是,试图帮助您的人不必浪费时间手动复制您的代码。

第二个更重要的原因是,当我不得不用我自己的代码重现你的错误时(对于你没有显示的代码位,例如Person 类),我已经正确地实现了代码,所以你的示例代码对我来说很好。

因此,我只能假设您的Person 课程中有错误,但由于您没有表明,我无法确认。我最好的猜测是你只是没有在Person 类中正确实现INotifyPropertyChanged,甚至可能是你的主类。当您这样做时,您应该会发现您的代码运行良好。

【讨论】:

  • +1 你复制的时间,你可能是对的,应该归咎于它的人
【解决方案2】:

和你一样,我最初认为你的问题是由绑定的执行顺序引起的,再加上某些属性的绑定模式默认为 TwoWay:

Current 现在是“Louis”,但绑定仍在查看“Mary”

但后来我用 CheckBox 替换了你的两个 RadioButtons,一切都按预期工作。

然后我开始搜索 RadioButton 控件的问题,我遇到了这个 stackoverflow 问题(以及许多其他问题):

Radiobutton wpf binding

将示例中的 RadioButtons 替换为在该问题的答案中找到的 RadioButtonExtended,并绑定到 IsCheckedExt 而不是 IsChecked,解决了问题 . 因此,您的问题似乎是由 RadioButton 控件中的错误引起的。

<local:RadioButtonExtended IsCheckedExt="{Binding IsMale}">Male</local:RadioButtonExtended>
<local:RadioButtonExtended IsCheckedExt="{Binding IsFemale}">Female</local:RadioButtonExtended>  

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多