4

文字列[StatusText]にバインドされているテキストブロック[statusTextblock]を含むメインウィンドウがあります。StatusTextblockは、別のウィンドウからのコンボボックスの結果を表示する必要があります。他のウィンドウで変更されたときにこのデータをメインウィンドウに戻し、これが発生したときに文字列を変更する静的メソッドを作成しました。

ただし、これらすべての静的性により、テキストボックス要素をどの時点でもStatusTextの新しい値に変更できなくなります。

ユーザーがメインウィンドウに戻ったときに変更を加えるための回避策を考えましたが、成功しませんでした。私はactivateとuielementのgotfocusイベントハンドラーを試しました(2番目のものはまだ可能な修正であると思います)。

それが重要な場合は、メインウィンドウも常に開いています。また、xamlよりもコードで作業する方が好きですが、助けていただければ幸いです。

何か案は?

MainWindow xaml、次にプログラムエントリメソッド、次にstatusTextを変更する静的イベント

<TextBlock Margin="190,0,0,0" HorizontalAlignment="Right" Name="StatusTextBlock" Text= {Binding}" ></TextBlock>

public MainWindow() //Obviously more went here, but it's not relevent
    {
        StatusTextBlock.DataContext = statusText;
    }

static public void changeStatusText(string status)
    {
        statusText = status;
    }
4

1 に答える 1

7

MVVMパターンを使用してアプリケーションを実装しようとすると、問題の解決が簡単になります。

  1. 文字列プロパティStatusTextを持つビューモデルクラスを定義します。

    public class MainViewModel : INotifyPropertyChanged
    { 
      private string _statusText;
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      public string StatusText
      {
        get
        {
            return _statusText;
        }
    
        set
        {
            if (value == _statusText)
                return;
    
            _statusText = value;
    
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("StatusText"));
        }
      }
    } 
    
  2. MainWindowのDataContextをMainViewModelのインスタンスに設定します。

    public MainWindow  //Obviously more went here, but it's not relevant
    {  
       private static MainViewModel _mainViewModel = new MainViewModel();
    
       public MainWindow() 
       { 
          this.DataContext = _mainViewModel;
       }
    
       static public void ChangeStatusText(string status)
       { 
         _mainViewModel.StatusText = status;
       }
     }
    
  3. ビューモデルへのデータバインディングを設定します。

     <TextBlock Margin="190,0,0,0" HorizontalAlignment="Right" Name="StatusTextBlock" Text="{Binding StatusText}" ></TextBlock>
    
于 2012-10-29T13:32:21.027 に答える