将文本框值传递给类,然后跨页绑定该值
本文关键字:然后 绑定 文本 值传 | 更新日期: 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 进行更新aliasname
则loggedin
类也需要进行一些更改:
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)
您不需要所有其他管道绒毛,例如事件和虚拟方法。对于您设置的每个视图模型,您需要重复哪种思想。非常重复。