WPF RadioButton已知问题:为什么旧属性值在属性更改后仍然具有约束力

WPF RadioButton已知问题:为什么旧属性值在属性更改后仍然具有约束力,wpf,data-binding,radio-button,2-way-object-databinding,Wpf,Data Binding,Radio Button,2 Way Object Databinding,谢谢。我希望我能上传整个解决方案,因为在开始这个问题之前我已经准备好了一个。但我不知道怎么做。我会在这里尽可能复制所有代码 问题是:我认为这在WPF中是一个很容易复制的问题。 我制作了一个简单的代码版本来清楚地解释我的问题。这个 示例中的容器“TwoPerson”有两个类实例 “人”。“当前”属性将是详细信息的数据上下文 填充个人详细信息的面板。我可以使用当前设置器 方法在不同的person之间跳转。我可以看到细节 相应地改变。问题是在切换和切换过程中 通过填充当前人员,UI控制更改(如将更改为

谢谢。我希望我能上传整个解决方案,因为在开始这个问题之前我已经准备好了一个。但我不知道怎么做。我会在这里尽可能复制所有代码

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

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

这是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 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>

男性
女性
下一步>>
注意。玛丽应该永远是个女人!但当点击上面的按钮导航时,它会改变

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

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


因此,我只能假设您的
Person
类中有一个错误,但由于您没有显示这一点,我无法确认。我最好的猜测是,您只是没有在
Person
类中正确实现
INotifyPropertyChanged
,甚至可能没有在主类中正确实现。当您执行此操作时,您会发现您的代码工作正常。

与您一样,我最初认为您的问题是由绑定的执行顺序造成的,再加上某些属性的绑定模式默认为双向:

现在流行的是“路易”,但装帧仍然是“玛丽”

但后来我用一个复选框替换了你的两个单选按钮,一切正常

于是我开始寻找RadioButton控件的问题,我遇到了这个stackoverflow问题(以及其他许多问题):

将示例中的单选按钮替换为该问题答案中的radiobuttonnextend,并绑定到IsCheckedExt而不是IsChecked,修复了该问题。 看来你的问题是由RadioButton控件中的错误引起的

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

您的问题还不够清楚,哪种绑定没有按预期工作?是的,很难准确理解到底是什么错了。允许重现问题的XAML将是最好的。@Somedust。。。尝试向下滚动查看XAML。我的问题很糟糕,没有引起足够的注意。尝试在示例中编写代码,是的,问题存在。另外,丢失值的总是第二个
单选按钮。+1您复制所花的时间,您可能是对的,它的person类也应该受到责备
<local:RadioButtonExtended IsCheckedExt="{Binding IsMale}">Male</local:RadioButtonExtended>
<local:RadioButtonExtended IsCheckedExt="{Binding IsFemale}">Female</local:RadioButtonExtended>