C# 无法绑定到DataContext的属性
这是我第一次发布问题。我花了一整天的时间研究这个问题,但不明白为什么这个绑定不起作用 我需要一个标签来显示对象“热点”的名称,该对象是名为Plan的类实例的属性。有多个计划,每个计划包含多个热点。单击热点时,属性C# 无法绑定到DataContext的属性,c#,wpf,xaml,data-binding,datacontext,C#,Wpf,Xaml,Data Binding,Datacontext,这是我第一次发布问题。我花了一整天的时间研究这个问题,但不明白为什么这个绑定不起作用 我需要一个标签来显示对象“热点”的名称,该对象是名为Plan的类实例的属性。有多个计划,每个计划包含多个热点。单击热点时,属性Plan.SelectedHotSpot将此单击的热点设置为值。如果没有选择热点,它将变为null XAML: 计划类别: public class Plan : INotifyPropertyChanged { private HotSpot selectedHotSpot;
Plan.SelectedHotSpot
将此单击的热点设置为值。如果没有选择热点,它将变为null
XAML:
计划类别:
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为空,因此它不会绑定到加载计划后选择的hotspot对象。
我的暗示对吗?该绑定需要有一个不为null的现有对象。当对象更改时,我们需要再次定义从label到Plan.SelectedHotSpot的绑定
谢谢您的帮助。我不确定它是否有用,但在
lstPlans\u selection changed
中尝试此绑定
:
var myBinding = new Binding();
myBinding.Path = new PropertyPath("SelectedHotSpot.Name");
myBinding.Source = canvas.Plan;
lblHotSpotName.SetBinding(Label.ContentProperty, myBinding);
如果SelectedHotSpot.Name
未更改,则在不需要此行时:
OnPropertyChanged("SelectedHotSpot.Name");
在
SelectedHotSpot
属性声明中。在给定代码中看不到任何问题(不过,不需要为.Name更改Raise属性)
我建议确认selectedHotSpot
始终具有某个实例且不为空。
尝试修改计划类并设置:
selectedHotSpot = new HotSpot(Name="Default")
您应该在标签中看到“Default”。我不能确定我是否完全正确地理解了您的问题,因为您的问题有点不清楚,但您是否可以不只是将数据绑定到XAML中的
label.Content
属性?如果要数据绑定当前在列表框
中选择的计划
项的SelectedHotSpot.Name
属性,则应能够执行以下操作:
<Label Name="lblHotSpotName"
Content="{Binding SelectedItem.SelectedHotSpot.Name, ElementName=lstPlans}" />
HotSpot.Name
属性支持INotifyPropertyChanged
<当触发lstPlans\u SelectionChanged
时,code>canvas.Plan不是null
?HotSpot.Name是一个字符串,在HotSpot类中不会更改,因此无需为此实现INotifyPropertyChanged接口。触发lstPlans\u SelectionChanged时,canvas.Plan从不为空。只有在加载窗口时,它才为空。请查看Visual Studio中的输出窗口,并告诉我们您在那里看到的错误。感谢您的评论。没有错误。只有lblHotSpotName的内容不显示所选热点的名称。但我想我知道这个问题的全部原因。作为Plan类中变量SelectedHotSpot始终保持更改的对象,我认为我无法绑定到该变量。它只保留在触发lstPlans\u SelectionChanged时设置的对象的引用,该值为null。不幸的是,它不起作用。谢谢你的建议。所以当我打开计划的时候。SelectedHotSpot为空。当我点击热点时。绑定没有看到该属性的更改,并保持为null。@Youszef:SelectedHotSpot
在lstPlans\u SelectionChanged
中为null?如果是,则绑定也为空。是SelectedHotSpot在触发时为空。我有没有办法解决这个问题。或者我应该在类计划中创建一个公共字符串,该字符串在选中时获取SelectedHotSpot.Name值。并绑定到公共字符串。是的,这个确实有效。所以我不可能绑定到一个变量,因为它的对象一直在变化?绑定到一个对象的实例。如果该对象为null,则UI上不会显示任何内容。问题是SelectedHostSpot可以为null,因为在运行时有不同的对象。我试过这个。但它仍然是空的。我之所以没有这么做是因为ListBox不包含Plan对象,而是包含ID,我随后使用ID从数据库获取数据,用它创建Plan对象。我这样做是出于性能原因。
selectedHotSpot = new HotSpot(Name="Default")
<Label Name="lblHotSpotName"
Content="{Binding SelectedItem.SelectedHotSpot.Name, ElementName=lstPlans}" />
<Label Name="lblHotSpotName" Content="{Binding SelectedItemHotSpotName}" />
private void lstPlans_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
canvas.Plan = PlanBLL.GetPlanByID(plans[lstPlans.SelectedIndex].ID);
SelectedItemHotSpotName = canvas.Plan.SelectedHotSpot.Name;
}