2014-02-22 115 views
3

这是我第一次发布问题。我正在研究这个问题大概一整天,但不明白为什么这个绑定不起作用。无法绑定到DataContext的属性

我想要一个Label来显示名为Plan的类实例的属性“hotspot”的名称。有多个计划,每个计划包含多个热点。当我点击热点时,Plan.SelectedHotSpot属性将此点击的热点设置为值。如果没有选择HotSpot,它将变为空。

XAML:

<Label Name="lblHotSpotName" /> 

主窗口后面的代码时,计划从列表框中选择:

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为null,因此它不会绑定到加载计划后选定的热点对象。 是我的冒险权吗?这个绑定需要有一个非null的现有对象。而当对象发生变化时,我们需要再次定义从标签到Plan.SelectedHotSpot的绑定。

感谢您的帮助。

+0

的'HotSpot.Name'属性支持'INotifyPropertyChanged'?当'lstPlans_SelectionChanged'被触发时'canvas.Plan'不是*'null' * * –

+0

HotSpot.Name是一个字符串,在HotSpot类中不会更改,因此不需要为此实现INotifyPropertyChanged接口。当触发lstPlans_SelectionChanged时,canvas.Plan从不为空。只有当窗口被加载时它是空的。 – Youszef

+0

请在Visual Studio的输出窗口中查看并告诉我们您在那里看到的错误。 – Sheridan

回答

1

我无法确定我是否完全理解了您的问题,因为您的问题有点不清楚,但是您能否将数据绑定到XAML中的Label.Content属性?如果你想将数据绑定当前在ListBox选择Plan项目的SelectedHotSpot.Name属性,那么你应该能够做这样的事情:

<Label Name="lblHotSpotName" 
    Content="{Binding SelectedItem.SelectedHotSpot.Name, ElementName=lstPlans}" /> 

UPDATE >>>

对于您的Binding,您最好使用XAML。添加string属性绑定到,然后更新您的lstPlans_SelectionChanged处理程序来代替:

<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; 
} 
+0

事情是SelectedHostSpot可以为null,因为在运行时有不同的对象。我试过这个。但它仍然是空的。为什么我没有这样做是因为ListBox不包含Plan对象,而是之后使用ID从数据库获取数据以创建Plan Object的ID。出于性能原因,我已经这样做了。 – Youszef

0

我不知道这将有助于与否,但在lstPlans_SelectionChanged试试这个Binding

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属性声明。

+0

不幸的是它不起作用。感谢您的建议。所以当我打开计划。 SelectedHotSpot为null。当我点击一个hotSpot。该绑定不会看到该属性的更改并保持为空。 – Youszef

+1

@Youszef:''SelectedHotSpot'在*'lstPlans_SelectionChanged' *中为null?如果是,那么绑定也是空的。 –

+0

是在触发的那一刻SelectedHotSpot为null。有什么办法可以解决这个问题吗?或者,我应该在类Plan中创建一个公共字符串,并在选中时获取SelectedHotSpot.Name值。并绑定到该公共字符串。 – Youszef

0

在给定的代码中看不到任何问题(但不需要为.Name更改Raise属性)。

我建议确认selectedHotSpot总是有一些实例,并且不为空。 尝试修改你的计划类,并设置:

selectedHotSpot = new HotSpot(Name="Default") 

,你应该看到“默认”的标签。

+0

是的,这确实有效。所以,我无法将它绑定到变量始终是对象变化的地方? – Youszef

+1

绑定是对象的一个​​实例。如果该对象为null,则在UI中不会显示任何内容。 –

相关问题