无法使数据绑定工作(我已经阅读了很多帖子,但无法弄清楚我做错了什么)

时间:2015-06-17 19:02:52

标签: c# wpf

我为INotifyPropertyChanged创建了这个基类...

namespace BASECLASSES.HelperClasses
{
    public class NotifyPropChangedBase : INotifyPropertyChanged
    {


    /// <summary>
    /// The propertyChanged Event to raise to any UI object
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;


    /// <summary>
    /// The PropertyChanged Event to raise to any UI object
    /// The event is only invoked if data binding is used
    /// </summary>
    /// <param name="propertyName"></param>
    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            PropertyChangedEventArgs args = new PropertyChangedEventArgs(propertyName);

            handler(this, args);
        }

    }

}

}

我创建了一个ViewModel,它在这里实现了基类......

  public class CheckoutVM : BASECLASSES.HelperClasses.NotifyPropChangedBase
{




    private string fullName ;

    public string FullName
    {
        get { return fullName; }
        set
        {
            if (fullName != value)
            {
                fullName = value;

                RaisePropertyChanged("FullName");
            }

        }
    }






}   


}

}

在XAML中,我为类定义了一个名称空间......

 xmlns:bcbcns="clr-Namespace:BASECLASSES.HelperClasses;assembly=BASECLASSES"

我已经定义了一个窗口资源......

  <Window.Resources>
      <m:CheckoutVM x:Key="chkOutViewModel"  />
  </Window.Resources> 

将DataContext设置为主网格...

   <Grid DataContext="{Binding Source={StaticResource chkOutViewModel}}">

将标签内容的路径设置为...

  <Label Name="txtContactCheckingOut"  Content="{Binding Path=FullName}"/>

接下来,我使用此代码设置标签......

 List<GET_CONTACT_Result> contactResultList = modsqlContact.GET_CONTACT(contactID);
 CheckoutVM checkOutContact = new CheckoutVM();
 checkOutContact.FullName = contactResultList[0].cFULLNAME;

但是没有设置标签。

如果我像这样向ViewModel添加一个构造函数....

    public CheckoutVM()
       {
          FullName = "XXXXXXXXXXXXXXXXX";
       }

标签设置为XXXXXXXXXXXXXXXXX,因此绑定似乎是正确的。

看起来处理程序始终为null。请帮忙!!!!我做错了什么???

2 个答案:

答案 0 :(得分:1)

你的checkOutContact与你的控件中使用的CheckoutVM实例不同的问题。

解决此问题的一种方法是在Window的代码隐藏中设置视图模型。像这样:

public CheckoutVM ViewModel
{
    get { return (CheckoutVM) DataContext; }
    set { DataContext = value; }
}

然后从网格中删除DataContext。默认情况下,Window中的控件将采用与Window相同的DataContext。

<Grid>
    ...
    <Label Name="txtContactCheckingOut"  Content="{Binding FullName}"/>
    ...
</Grid>

你就像这样初始化你的窗口:

YourWindow yourWindow = new YourWindow();
yourWindow.ViewModel = new CheckoutVM();
yourWindow.ViewModel.FullName = contactResultList[0].cFULLNAME;

这应该可以解决问题。

答案 1 :(得分:1)

您的资源在Resources属性后面的代码中可用,该属性是合并的资源字典。您的物品将通过您提供的钥匙提供。假设用于设置FullName属性的示例代码位于后面的Window代码中,以下代码应允许您将值更新为绑定实例。

List<GET_CONTACT_Result> contactResultList = modsqlContact.GET_CONTACT(contactID);
var contact = (CheckoutVM)Resources["chkOutViewModel"];
contact.FullName = contactResultList[0].cFULLNAME;