2017-05-17 7 views
0

バインドされたテキストボックスを更新するのが難しいです。私はまだWPFの開発には新しく、この時点でインターネット上で利用可能なほとんどすべてを読んだので基本的な概念が失われているに違いありません。私はまだ混乱しています。以下は私のコードです。まず、私の質問の文脈をよりよく設定するために私がやっていることの概要。テキストボックスへのデータバインディングとプロジェクト全体でのオブジェクトの共有

メインウィンドウは、フレームソースタグを使用してさまざまなページを読み込むタブを含むウィンドウです。これは、実際のオブジェクトが各タブでインスタンス化されている場所がわからないため、XAMLがロードされているだけなので、問題が発生する可能性があります。

Scratchpadはテキストボックスを含むクラスで、ステータスやエラーを報告するための操作を行うほぼすべてのクラスで使用されます。

テキストボックスXAML(これは文脈のために、 "ScratchPad_View.xaml" である)XAML

背後

<TextBox x:Name="scratchMessage" 
      Text="{Binding Path=ScratchMessage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
      HorizontalAlignment="Right" 
      Height="300" 
      Width ="500" 
      TextWrapping="Wrap" 
      VerticalAlignment="Top"/> 

コード

public partial class ScratchPad : Page 
{ 
    public ScratchPad() 
    { 
     InitializeComponent(); 
     ScratchPad_Model ScratchPad_Model = new ScratchPad_Model(); 
     this.DataContext = ScratchPad_Model; 
    } 
} 

モデルの実装

class ScratchPad_Model : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public string _scratchMessage; 
    public string ScratchMessage; 
    { 
     get 
     { 
      return _scratchMessage; 
     } 
     set 
     { 
      if (value != _scratchMessage) 
      { 
       _scratchMessage = value; 
       OnPropertyChanged("ScratchMessage"); 
      } 
     } 
    } 
    // Create the OnPropertyChanged method to raise the event 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

私は石畳いるこのの大半StackOverflowに関する他の質問への回答と多数のデータバインディングチュートリアルしかしそれはまだクリックしていません。私はテキストボックスの内容を更新する方法がわかりませんし、メインウィンドウのXAMLのテキストボックスを含むページを読み込んでいるため、正しいオブジェクトを参照しているかどうかわかりません。メインウインドウは、このページを下にコピーされたフレームタグに読み込みます。

<Frame Source="Common/View/ScratchPad_View.xaml" ></Frame> 

このXAMLのコードは、次のとおりです。

public partial class MainWindow 
{ 
    // Create scratchpad object for logging and status display 
    ScratchPad scratchPad = new ScratchPad(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void StartVault(object sender, RoutedEventArgs e) 
    { 
     // Creates the authentication prompt view object and pass the scratchPad reference for reporting 
     authPrompt_View _authPrompt_View = new authPrompt_View(scratchPad); 
    } 
} 

私はしかし、私は結合を得ることに多くの幸運を持っていなかった、彼らはテキストボックスの内容を更新できるように、私はすべてのクラスにメインウィンドウの初期化中に作成されたScratchPadのオブジェクトへの参照を渡します働く一度それが動作すると、私はまだテキストボックスにテキストを追加するはずですが、私はまだよく分かりません。ここには多大な問題があるかもしれませんが、私は概念的な問題のいくつかを修正し、私が間違っていることをよりよく理解することを望んでいます。

+0

これらの不要な説明段落を削除できますか? –

答えて

1

Application.Propertiesを使用して、プロジェクトのグローバルプロパティを設定できます。おそらく、あなたのケースのScratchMessageのテキストボックスにバインドされた変数のSETTERメソッドでは、グローバルアプリケーションプロパティコレクションにプロパティを設定する必要があります。リンク以下

は非常によく、それを説明する: https://msdn.microsoft.com/en-us/library/aa348545(v=vs.100).aspx http://www.c-sharpcorner.com/Resources/842/application-properties-in-wpf-and-c-sharp.aspx

+0

お返事ありがとうございます!私は常に物事をグローバルにすることを避けるように言われてきましたが、私はそれが絶対にうまくいくと信じています! – hex

+1

@hex - 私は.netプログラマではなく、主にPythonでコードします。 「私はいつも物事をグローバルにすることを避けるように言われてきました」 - それはガイドラインであり、多くの場合、それに従うことができます。しかし、理解しやすく、チーム全体が同じ構造に従う限り、私は実用的であると信じています。繰り返しますが、コードビハインドCSファイルにいくつかのコードを入れておくと、直感的で読みやすく管理しやすくなります。 –

1

私の理解では、あなたは、コンストラクタ内でスクラッチパッドのためのViewModelを作成し、同じでDataContextのを割り当てている、ということです。 したがって、他のウィンドウはDataContextにアクセスできません。

私の提案は、ベースViewModelクラスを維持し、他のすべてのViewModelでベースViewModelを継承することです。

Base viewModel内にScratchMessageプロパティを追加します。 他のviewModelからもScratchMessageプロパティにアクセスできます。

public class BaseViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private string _scratchMessage; 

     public string ScratchMessage 
     { 
      get { return _scratchMessage; } 
      set 
      { 
       _scratchMessage = value; 
       this.OnPropertyChanged("ScratchMessage"); 
      } 
     } 

     // Create the OnPropertyChanged method to raise the event 
     protected virtual void OnPropertyChanged(string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    public class ViewModel1 : BaseViewModel 
    { 
     ViewModel1() 
     { 
      this.ScratchMessage = "Message"; 
     } 
    } 
+0

これは素晴らしいアイデアだと私は前にこの提案に出くわしたとは思わない。私はそれに今すぐショットを与えるつもりです、遅れた応答のためにお詫び申し上げます。 – hex

関連する問題