无法绑定到DataContext的Property

时间:2014-02-22 17:07:24

标签: c# wpf xaml data-binding datacontext

这是我第一次发帖提问。我正在研究这个问题大约一整天但是看不出为什么这个绑定不起作用。

我希望Label显示对象“hotspot”的名称,该对象是名为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为null,因此它不会绑定到加载计划后选择的热点对象。 我的暗示是对的吗?该绑定需要具有非null的现有对象。当对象发生变化时,我们需要再次定义从标签到Plan.SelectedHotSpot的绑定。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我无法确定我是否完全理解您的问题,因为您的问题有点不清楚,但是您是否只能将数据绑定到XAML中的Label.Content属性?如果您想要数据绑定SelectedHotSpot.Name中当前选中的Plan项的ListBox属性,那么您能够执行此类操作:

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

更新&gt;&gt;&gt;

您最好还是为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;
}

答案 1 :(得分: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属性声明中。

答案 2 :(得分:0)

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

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

selectedHotSpot = new HotSpot(Name="Default")

你应该看到&#34;默认&#34;在你的标签上。