我是sliverlight和MVVM的初学者。 我无法使用MVVM将textblock属性从另一个类绑定到UI类。
我的代码在这里。 请告诉我如何在下面的Authentication.cs中绑定textblock属性。
MainPage.xaml中
<TextBlock Height="30" Margin="122,218,0,0" Name="textBlock3" Text="{Binding Path=ErrorStatus, Mode=TwoWay}" VerticalAlignment="Top" HorizontalAlignment="Left" Width="86" />
MainPage.xaml.cs中
private Authentication authentication;
// Constructor
public MainPage()
{
InitializeComponent();
this.DataContext = authentication;
}
ViewModelBase.cs
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
Authentication.cs
public class Authentication : ViewModelBase
{
private string _ErrorStatus;
public string ErrorStatus
{
get
{
return _ErrorStatus;
}
set
{
_ErrorStatus = value;
NotifyPropertyChanged("ErrorStatus");
}
}
void Authenticate()
{
//Here, I write authentication code....
//After the authentication code, I want to change textBlock property depend on auth status.
//Please let me know how to write code.
}
}
答案 0 :(得分:0)
您尚未创建Authentication
的新实例。将以下行添加到主窗口构造器:
// Constructor
public MainPage()
{
InitializeComponent();
// New line here
this.authentication = new Authentication();
this.DataContext = authentication;
}
当您致电Authenticate()
时,您可以为ErrorStatus
分配一个新值,它应显示在TextBlock
。
答案 1 :(得分:0)
您在ErrorStatus = "Access Denied";
方法
Authenitcate()
TextBox的Text指向ErrorStatus
属性,因此只要它更新TextBox,它也会自动更新。
您唯一需要确定的是,您在TextBox绑定的同一对象上调用Authenticate()
。
private Authentication authentication = new Authentication();
public MainPage()
{
InitializeComponent();
// New line here
this.authentication = new Authentication();
this.DataContext = authentication;
}
void btnAuthenticate_Click(object src, EventArgs e)
{
authentication.Authenticate();
}
XAML:
<TextBlock Text="{Binding Path=ErrorStatus, Mode=TwoWay}" />
答案 2 :(得分:0)
这是委托命令模式(也称为relay命令)使用此模式进入播放http://kharasoft.wordpress.com/2007/10/16/the-delegating-command/的地方,而不是在后面的代码中处理按钮单击,您的viewmodel公开了一个ICommand实例,它只是将事件路由到viewmodel上的方法。现在,authenticate在viewmodel的上下文中运行,并且可以直接更新属性。