2014-10-30 79 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很多清洁

相关问题