2009-07-28 28 views
4

我有一個菜單項將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」 。下次我打開菜單我有相同的價值。有沒有辦法強制菜單每次評估綁定? (然後進行「測試3」,「測試45」,「測試65」...

回答

1

這是一個黑客我在相同的情況下使用:

爲您的上下文菜單命名並創建您自己的RoutedCommand,我將它們用於所有按鈕和菜單,因爲它們具有CanExecute方法,該方法啓用或禁用該控件和一個被調用來執行工作的Execute方法。每當上下文菜單打開時,CanExecute方法就會被調用。這意味着您可以執行自定義處理以查看是否應啓用,或者您可以更改菜單的內容,適用於在保存不同內容時更改菜單的內容。我們用它來說,保存xyx ..當用戶正在編輯一個xyx時。

無論如何,如果菜單被命名,您可以在CanExecute上修改其內容。 (如果命令始於菜單上,則無論如何都將它作爲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";)修改Test從任何地方的價值和變化將在UI反映

如果你真的需要改變的值財產當顯示ContextMenu,使用Opend事件ContextMenu的:

的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 2009-07-31 07:11:22