感谢。我希望在打开这个问题之前,我可以上传完整的解决方案。但我没有找到怎么样。我将尽可能复制所有代码。
问题是:我认为这是WPF中一个容易复制的问题。 我制作了一个简单的代码版本来清楚地解释我的问题。该 示例中的容器“TwoPersons”有两个类实例 '人'。 “当前”属性将是详细信息的数据上下文 填充人员详细信息的面板。我可以使用Current setter 在不同的人之间跳跃的方法。我可以看到细节 相应地改变。问题是在转换过程中 填充当前人,UI控制更改(如将男性更改为 女)),然后这个变化会影响它所绑定的PREVIOUS项目。该 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>
答案 0 :(得分:1)
当你问一个StackOverflow问题时,你真的应该提供所有代码来重现你的问题。您应该这样做的第一个原因是,试图帮助您的人不必浪费时间手动复制代码。
第二个更重要的原因是,当我不得不用我自己的代码重现你的错误时(对于你没有显示的代码,例如Person
类),我已经实现了代码正确,所以你的示例代码对我来说很好。
因此,我只能假设您的Person
课程中有错误,但由于您没有证明,我无法确认。我最好的猜测是你没有在INotifyPropertyChanged
课程中正确实现Person
,甚至可能是你的主要课程。执行此操作时,您应该发现您的代码运行正常。
答案 1 :(得分:0)
就像你一样,我最初认为你的问题是由绑定执行的顺序引起的,再加上一些属性的绑定模式默认为TwoWay:
现在是“路易斯”,但绑定仍在关注“玛丽”
然后我用CheckBox替换了你的两个RadioButtons,一切都按预期工作。
然后我开始搜索RadioButton控件的问题,我遇到了这个stackoverflow问题(还有很多其他问题):
使用该问题的答案中的 RadioButtonExtended 替换示例中的RadioButtons,并绑定到 IsCheckedExt 而不是IsChecked,修复了问题 。 所以看起来你的问题是由RadioButton控件中的一个错误引起的。
<local:RadioButtonExtended IsCheckedExt="{Binding IsMale}">Male</local:RadioButtonExtended>
<local:RadioButtonExtended IsCheckedExt="{Binding IsFemale}">Female</local:RadioButtonExtended>