2011-03-17 80 views
0

我有一個TextBox,我將焦點放在使用綁定到視圖模型屬性的附加屬性上。附加屬性調用「UIElement.Focus()」來設置焦點。問題是當TextBox以這種方式接收焦點時,「GotFocus」事件不會觸發。我正在使用Caliburn.Micro的Message.Attach來處理事件。有任何想法嗎?當文本框獲取焦點時需要校準Message.Attach的幫助

這是TextBox。

<TextBox x:Name="Test" 
     Grid.Column="0" 
     Text="{Binding Test, Converter={StaticResource TestToStringConverter}}" 
     AttachedProperties:FocusExtension.IsFocused="{Binding IsTestFocused}" 
     cal:Message.Attach="[Event GotFocus] = [Action OnGotFocus($eventargs)]; /> 

這裏是附加屬性(在SO上找到)。

public static class FocusExtension 
{ 
    public static bool GetIsFocused(DependencyObject obj) 
    { 
     return (bool) obj.GetValue(IsFocusedProperty); 
    } 

    public static void SetIsFocused(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsFocusedProperty, value); 
    } 

    public static readonly DependencyProperty IsFocusedProperty = 
     DependencyProperty.RegisterAttached("IsFocused", typeof (bool), typeof (FocusExtension), 
              new UIPropertyMetadata(false, OnIsFocusedPropertyChanged)); 

    private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var uie = (UIElement)d; 

     if ((bool)e.NewValue) 
     { 
      uie.Focus(); 
     } 
    } 
} 
+0

你能否提供附屬物的代碼? – devdigital 2011-03-17 23:48:15

+0

已更新,以添加附加的財產代碼。 – Snarfblatt 2011-03-18 14:53:13

回答

0

我自己試過這個,並且能夠複製這個問題。我不太清楚爲什麼會發生這種情況,它可能與用戶控件(即視圖)生命週期有關。一種選擇是擴展附屬屬性,以便在視圖模型上調用動詞uie.Focus()

動詞的名稱可能是您的FocusExtension附屬屬性上的依賴屬性,可以在視圖中設置。

+0

請原諒我的新手,但我不確定你的意思是「調用動詞」。我對WPF/MVVM相當陌生。 – Snarfblatt 2011-03-21 23:07:16

+0

沒關係,我的意思是在視圖模型類上調用或運行一個方法。在這種情況下,您只需運行OnGotFocus方法,以便您可以使附加屬性具有足夠的通用性,以便您希望運行的方法的名稱是附加屬性的屬性。如果這是有道理的。 – devdigital 2011-03-21 23:20:00

+0

能否告訴我一個你的意思的簡短例子?從我正在閱讀的內容來看,這聽起來好像附加的屬性會對視圖模型有所瞭解,但我相信我可能只是誤解。 – Snarfblatt 2011-03-21 23:31:27