2009-07-28 4 views
4

私はそれでのMenuItemとのContextMenuている:テストプロパティは次のようにContextMenuを開くたびにバインディング評価を強制する方法はありますか?

<Grid> 
    <Button Content="{Binding Test}"> 
     <Button.ContextMenu> 
      <ContextMenu> 
       <StackPanel> 
        <MenuItem Header="{Binding Test}"/> 
       </StackPanel> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 
</Grid> 

になります:

private Random rand; 

public string Test 
{ 
    get 
    { 
     return "Test " + this.rand.Next(50); 
    } 
} 

私は右例えば、私が持っている、ボタンをクリックして「テスト41」 。次回は、私は同じ値を持っているメニューを開きます。メニューが毎回バインディングを評価するように強制する方法はありますか? (そして "Test 3"、 "Test 45"、 "Test 65" ...

答えて

1

iが同じような状況での使用ハックです:

ContextMenuが表示されたときに、 ContextMenuOpendイベントを使用

コンテキストメニューに名前を付け、独自のRoutedCommandを作成します。これらはすべてのボタンとメニューに使用します。これは、CanExecuteメソッドを使用するためです。コントロールを無効にし、作業を行うために呼び出されるExecuteメソッドを呼び出します。コンテキストメニューが開くたびにCanExecuteメソッドが呼び出されます。つまり、カスタム処理を実行して有効にする必要があるかどうかを確認したり、メニューの内容を変更したりして、異なるものを保存するときにメニューを変更することができます。ユーザーがxyxを編集しているときに、xyxを保存します。

とにかくメニューに名前がついていれば、CanExecuteでその内容を変更できます。 (もしコマンドがメニュー上で始まっていれば、イベントの送信者であるとみなされますが、スコープ内のどこからでも実行可能なキーボードショートカットを割り当てることができます。

0

あなたのTestプロパティは、値が変わるたびに、例えばINotifyPropertyChangedインターフェイスをこのようなクラスに実装することによって他のコンポーネントに知らせる必要があります:

class Window1 : Window, INotifyPropertyChanged { 

    ... 

    private string m_Test; 

    public string Test { 
    get { 
     return m_Test; 
    } 
    set { 
     m_Test = value; 
     OnPropertyChanged("Test"); 
    } 
    } 

} 

あなたは、プロパティ(Test = "newValue";)を使用して、変更がUIに反映されますでどこからでもTestの値を変更することができ

をあなたが本当にの値を変更する必要がある場合。プロパティ

XAML:

<ContextMenu Opened="UpdateTest"> 
    <MenuItem Header="{Binding Test}" /> 
</ContextMenu> 

コードビハインド:ここ

private void UpdateTest(object sender, RoutedEventArgs e) { 
    // just assign a new value to the property, 
    // UI will be notified automatically 
    Test = "Test " + this.rand.Next(50); 
} 
+0

私はあなたがそれを取得しないと思う、申し訳ありませんが、私は不明です。 私はINotifyPropertyChangedのことを知っています。私はTestプロパティに新しい値を代入したくありません。私はちょうどメニューが開かれるたびに値が再評価されることを望んでいます。 – japf

関連する問題