我为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。请帮忙!!!!我做错了什么???
答案 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;