【发布时间】:2014-03-24 07:52:26
【问题描述】:
这是我第一次发布问题。我正在研究这个问题大约一整天,但不明白为什么这个绑定不起作用。
我想要一个标签来显示对象“热点”的名称,它是名为 Plan 的类实例的属性。有多个计划,每个计划包含多个热点。当我单击一个热点时,属性Plan.SelectedHotSpot 将此单击的热点设置为值。如果没有选择 HotSpot,它将变为 null。
XAML:
<Label Name="lblHotSpotName" />
从ListBox中选择Plan时的MainWindow代码:
private void lstPlans_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
canvas.Plan = PlanBLL.GetPlanByID(plans[lstPlans.SelectedIndex].ID);
lblHotSpotName.DataContext = canvas.Plan;
lblHotSpotName.SetBinding(Label.ContentProperty, "SelectedHotSpot.Name");
}
计划课:
public class Plan : INotifyPropertyChanged
{
private HotSpot selectedHotSpot;
public HotSpot SelectedHotSpot
{
get { return selectedHotSpot; }
set
{
selectedHotSpot = value;
OnPropertyChanged("SelectedHotSpot");
OnPropertyChanged("SelectedHotSpot.Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
当我点击热点lblHotSpotName 保持空白时,此代码似乎不起作用。
在我看来,加载计划时 SelectedHotSpot 为空,因此它不会绑定到加载计划后选择的热点对象。
我的暗示对吗?此绑定需要有一个不为空的现有对象。而当对象发生变化时,我们需要重新定义从标签到Plan.SelectedHotSpot的绑定。
感谢您的帮助。
【问题讨论】:
-
HotSpot.Name属性支持INotifyPropertyChanged?当lstPlans_SelectionChanged被触发时,canvas.Plan不是null? -
HotSpot.Name 是一个字符串,不会在 HotSpot 类中更改,因此无需为此实现 INotifyPropertyChanged 接口。当触发 lstPlans_SelectionChanged 时,canvas.Plan 永远不会为空。只有在加载窗口时它才为空。
-
请查看您在 Visual Studio 中的输出窗口,并告诉我们您看到的错误。
-
感谢您的评论。没有错误。只有 lblHotSpotName 的内容不显示 SelectedHotSpot 的名称。但我想我知道这个问题的全部原因。由于 Plan Class 中的变量 SelectedHotSpot 一直保持变化的对象,我认为我无法绑定到它。它只是保留对在触发 lstPlans_SelectionChanged 时设置的对象的引用,该对象为空。
标签: c# wpf xaml data-binding datacontext