【发布时间】: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