在WPF中如何在主窗口更新中创建文本框?

时间:2014-01-19 21:39:20

标签: c# wpf

所以我设置了一个简单的文本框

<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;

我的代码不起作用,我该怎么办?

1 个答案:

答案 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">