Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法绑定到DataContext的属性_C#_Wpf_Xaml_Data Binding_Datacontext - Fatal编程技术网

C# 无法绑定到DataContext的属性

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的类实例的属性。有多个计划,每个计划包含多个热点。单击热点时,属性
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;
}