1

我不确定我要去哪里错了。我正在尝试使用类在页面之间传递文本框值。

我创建了一个类页面,并在其中创建了用于绑定文本框的属性。

using System.Threading.Tasks;

namespace Masca
{
    public class loggedin
    {
        public string aliasname { get; set; }
    }
}

然后在主窗口后面的代码中,我注册了刚刚创建的新“记录”类。然后我实例化它并给它一个值FOO

using MySql.Data.MySqlClient;

namespace Masca
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : ModernWindow
    {
        public loggedin loggedin;

        public MainWindow(string Str_Value)
        {
            InitializeComponent();

            loggedin = new loggedin { aliasname = "FOO" };
            this.DataContext = loggedin;
            username.Text = Str_Value;

然后我添加到我想显示的所有页面FOO

this.DataContext = logged;

然后我将文本框绑定到“记录”属性,例如

<TextBox x:Name="username" Text="{Binding aliasname}" Margin="134,77,0,0" 
    HorizontalAlignment="Left" Width="211" Height="19" 
    VerticalAlignment="Top" FontSize="11" />

不幸的是,唯一显示FOO的页面是我实例化它的页面,我在其中放置:

loggedin = new loggedin { aliasname = "FOO" };

从理论上讲,您希望loggedin通过foo页面对吗?没有这样的运气。有谁知道我哪里出错了?Foo应该是 的内容Username.text。所以所有页面都知道谁刚刚登录。该值已经使用 winforms 方法从登录页面成功传递到主窗口。

4

2 回答 2

1

问题是你的类不是singleTon,它没有实现INotitfyPropertyChanged,改变你的代码如下

public class loggedin:INotitfyPropertyChanged
{
    private static loggedin instance=new loggedin ();
    public static loggedin Instance
    {
         get{return instance;}
    }
    private string alisa;
    public string aliasname 
    { 
      get
      {
          return alisa;
      } 
      set
      {
          alisa=value;
          RaisePropertyChanged("aliasname");

      } 
    }



    private void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null) 
        { 
          PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

然后在所有 xmal.cs 中设置数据上下文,如下所示,如果您访问任何属性也使用相同的方式

DataContext=loggedin.Instance;

要访问属性,请执行以下方式

loggedin.Instance.aliasname="Foo";
于 2013-10-28T02:03:51.990 回答
0

好的,根据您提供的评论,如果您要导航到将页面与页面上的链接分开,那么您实际上是在远离MainWindow.xaml,从而破坏了数据上下文。如果 MainWindow.xaml 确实是一个框架,您应该将每个新嵌入页面作为 MainWindow 中的页面用户控件,然后默认情况下用户控件继承其父级的DataContext. 在您的情况下,这可以被转换为 aloggedin并被使用。

我还强烈推荐使用 Laurent Bugnion 的MVVM Light框架。它是采用 MVVM 模式并鼓励和规范最佳实践的使用的绝佳框架。从基础开始也并不可怕。这是一个快速入门示例本文很好地剖析了 hello world 示例(忽略它说的 windows phone,这个示例对 wpf 的工作方式相同)。

还应该注意的是,loggedin如果您希望aliasname在 UI 收到任何数据更改时对其进行更新,您的类也需要进行一些更改:

public class loggedin : INotifyPropertyChanged
    {
        public string _aliasname = null;
        public string aliasname
        {
            get { return _aliasname; }
            set
            {
                _aliasname = value;
                OnPropertyChanged("aliasname");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

然而,使用 MVVM Light,您实际上只会ViewModelBase在 setter 中继承和调用这一行:RaisePropertyChanged(() => aliasname)您不需要所有其他管道绒毛,例如事件和虚拟方法。对于您设置的每个视图模型,您需要重复哪个想法。非常重复。

于 2013-10-28T02:08:45.937 回答