将文本框值传递给类,然后跨页绑定该值

本文关键字:然后 绑定 文本 值传 | 更新日期: 2023-09-27 18:37:01

我不确定我在这里哪里出错了。我正在尝试使用类跨页面传递文本框值。

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

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 方法成功从登录页面传递到主窗口。

将文本框值传递给类,然后跨页绑定该值

问题是你的类不是 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";

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

我还强烈建议使用Laurent Bugnion的MVVM Light框架。它是采用 MVVM 模式的绝佳框架,并鼓励和规范最佳实践的使用。从基础知识开始也不可怕。这将演练一个快速入门示例,本文很好地介绍了 hello world 示例(忽略它说 Windows Phone,此示例对 wpf 的工作方式相同)。

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

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)您不需要所有其他管道绒毛,例如事件和虚拟方法。对于您设置的每个视图模型,您需要重复哪种思想。非常重复。