所以我设置了一个简单的文本框
<Window x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding}" xmlns:Local="clr-namespace:MyProject">
<TextBox Name="txb_userActivity" IsEnabled="False" IsReadOnly="True">
<TextBox.Text>
<Binding Path="lastUserActivity">
</Binding>
</TextBox.Text>
</TextBox>
</Window>
我正在尝试设置一个属性:
namespace MyProject{
public partial class MainWindow : Window{
private DateTime _lastUserActivity = DateTime.Now;
public DateTime lastUserActivity{
set {
_lastUserActivity = value;
}
get {
return _lastUserActivity;
}
}
}
}
这样,当文本更改时,文本框将更新它的值:
lastUserActivity = DateTime.Now;
我的代码不起作用,我该怎么办?
答案 0 :(得分:1)
您的视图需要通知必须更新。
您必须使用DependencyProperty
或实施INotifyPropertyChanged
,然后您的二传手应该看起来像
private DateTime _lastUserActivity = DateTime.Now;
public DateTime LastUserActivity {
set {
_lastUserActivity = value;
}
get {
return _lastUserActivity;
OnPropertyChanged("LastUserActivity")
}
}
此外,您应该使用ViewModel,并且不要在Window的代码隐藏中使用此属性。如果您希望Binding工作,则必须为此ViewModel设置DataContext
。当您将其保留在代码隐藏中时,您必须将窗口设置为DataContext
。
编辑:
对于DependencyObject
,您应该使用DependencyProperty
,如下所示:
// Dependency Property
public static readonly DependencyProperty LastUserActivityProperty =
DependencyProperty.Register( "LastUserActivity", typeof(DateTime),
typeof(MainWindow), new FrameworkPropertyMetadata(DateTime.Now));
// .NET Property wrapper
public DateTime LastUserActivity
{
get { return (DateTime)GetValue(LastUserActivityProperty); }
set { SetValue(LastUserActivityProperty, value); }
}
但又一次: 如果您希望使用绑定,您应该熟悉MVVM原则并使用ViewModel而不是代码隐藏。这样的事情:http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial
EDIT2: 你的DataContext是错误的。
<Window x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}" xmlns:Local="clr-namespace:MyProject">