2014-10-30 77 views
0

在我的WPF應用程序中,我使用Caliburn.Micro在View和ViewModel之間進行綁定。如何使用Caliburn.Micro選擇文本框中的所有文本?

在我看來,我的StackPanel用文本框的

<StackPanel> 
    <TextBox x:Name="Ctx_A" /> 
    <TextBox x:Name="Ctx_B" /> 
    <TextBox x:Name="Ctx_C" /> 
    <TextBox x:Name="Ctx_D" /> 
</StackPanel> 

現在我要選擇專注於文本框後的所有文本。在我的ViewModel我寫的方法TextBoxGotFocus

public void TextBoxGotFocus(object sender) 
{ 
    var tb = sender as TextBox; 
    if (tb != null) 
    { 
    tb.SelectAll(); 
    } 
} 

接下來,我回到我的看法,寫這樣的事情:

<StackPanel> 
    <TextBox x:Name="Ctx_A" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/> 
    <TextBox x:Name="Ctx_B" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/> 
    <TextBox x:Name="Ctx_C" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/> 
    <TextBox x:Name="Ctx_D" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/> 
</StackPanel> 

是否有任何可能附加這種方法的StackPanel代替文本框?

回答

1

我會從視圖模型中刪除TextBoxGotFocus()方法,因爲它會模糊視圖和視圖模型之間的界限。視圖模型不應該在其中使用任何WPF控件。相反,我能想到的最簡單的方法是創建一個從TextBox繼承的類,然後附加一個事件到:

public class AutofocusTextBox : TextBox 
{ 
    public AutofocusTextBox() 
    { 
     GotFocus += (sender, e) => SelectAll(); 
    } 
} 

然後在你的XAML中,你可以使用它像這樣:

<local:AutofocusTextBox ... /> 

,將讓您的XAML很多清潔

相關問題