我不确定我在哪里出错了。我试图使用类传递跨页面的文本框值。
我创建了一个类页面,并在其中创建了用于绑定文本框的属性。
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方法成功地从登录页面传递到主窗口。
答案 0 :(得分: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";
答案 1 :(得分:0)
好的,根据您提供的评论,如果您要从页面上的链接导航到单独的页面,您实际上是从MainWindow.xaml
导航,从而打破了数据上下文。如果MainWindow.xaml确实是一个框架,您应该将每个新的嵌入页面作为MainWindow中的用户控件页面,用户控件然后默认继承其父项DataContext
。在您的情况下,可以将其转换为loggedin
并使用。
我还强烈建议使用Laurent Bugnion的MVVM Light框架。它是采用MVVM模式并鼓励和规范最佳实践使用的理想框架。开始使用基础知识并不可怕。通过一个快速的getting started sample和this article非常好地分析了hello world样本(忽略它说的是windows phone,这个样本对于wpf也是一样的。)
还应该注意的是,如果您希望在UI上获得loggedin
更新,如果收到任何数据更改,那么您的aliasname
课程也需要进行一些更改:
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)
你不需要所有其他的管道漏洞,例如事件和虚方法。对于您设置的每个视图模型,您需要重复哪种思路。非常重复。