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。あなたの場合、これは としてキャストしてloggedin利用できます。

また、Laurent Bugnion によるMVVM Lightフレームワークの使用を強くお勧めします。これは、MVVM パターンを採用するための優れたフレームワークであり、ベスト プラクティスの使用を奨励および規制します。基本から始めることも怖くありません。これは、クイックスタートのサンプルを順を追って説明したもので、この記事では、Hello World のサンプルを非常にうまく分析しています (Windows Phone と書かれていることは無視してください。このサンプルは wpf でも同じように機能します)。

また、データの変更を受け取った場合に UIloggedinを更新したい場合は、クラスにもいくつかの変更が必要になることに注意してください。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 を使用すると、実際にはViewModelBasesetter でこの 1 行を継承して呼び出すだけで済みますRaisePropertyChanged(() => aliasname)。イベントや仮想メソッドなど、他のすべての配管の綿毛は必要ありません。セットアップするビューモデルごとに、どちらの心を繰り返す必要があるか。非常に繰り返します。

于 2013-10-28T02:08:45.937 に答える