2013-03-10 110 views
1

我有WPF XAML代码如下图所示:动态改变FocusManager.FocusedElement

<StackPanel FocusManager.FocusedElement="{Binding FocusedElement}"> 
    <TextBox Name="txtbox1" Text="FirstText"/> 
    <TextBox Name="txtbox3" Text="SecondText"/> 
    <TextBox Name="txtbox2" Text="ThirdText"/> 
    </StackPanel> 

我如何绑定FocusedElement物业在视图模型?下面 类似的代码:

Switch(Type) 
{ 
Case "FirstType" : 
    FocusedElement = "txtbox1"; 
break; 
Case "SecondType" : 
    FocusedElement = "txtbox2"; 
break; 
Case "ThiredType" : 
    FocusedElement = "txtbox3"; 
break; 
} 

回答

5

viewmodel不应该知道视图,当然不知道一些UIElement名称。但考虑到视图模型确实需要能够管理对焦(我建议你确认这确实是继续之前的情况),你可以做这样的事情:

enter image description here

视图模型:

public enum Focuses 
{ 
    None = 0, 
    First, 
    Second, 
    Third 
} 

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private Focuses _focusedElement; 
    public Focuses FocusedElement { get { return _focusedElement; } set { _focusedElement = value; OnPropertyChanged("FocusedElement"); } } 


    public ViewModel() 
    { 
     this.FocusedElement = Focuses.Second; 
    } 
} 

Xaml:

<StackPanel > 
    <TextBox Name="txtbox1" Text="FirstText"/> 
    <TextBox Name="txtbox2" Text="SecondText"/> 
    <TextBox Name="txtbox3" Text="ThirdText"/> 
    <StackPanel.Style> 
     <!-- cannot use DataTriggers directly in StackPanel.Triggers, therefore Style --> 
     <Style TargetType="{x:Type StackPanel}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding FocusedElement}" Value="First"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtbox1}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding FocusedElement}" Value="Second"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtbox2}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding FocusedElement}" Value="Third"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtbox3}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Style> 
</StackPanel> 
0

的FocusedElement是具有特定焦点范围逻辑焦点的元素。

逻辑重点,而不是“真正的焦点”,如txtBox1.Focus();

逻辑焦点可以设置多次,而只有一个元素可以有键盘焦点。

你真的需要合乎逻辑的焦点吗?

您可以收听GotFocus事件,然后执行一些自定义逻辑作为示例。