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

时间:2013-10-28 01:33:44

标签: c# wpf xaml mvvm

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

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

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

2 个答案:

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