在更改下拉列值时将焦点设置在文本框上

时间:2016-12-05 18:07:22

标签: c# wpf mvvm

我的C#/ WPF应用程序中有一个xaml屏幕,它有一个组合框(ProductType)和一个文本框(ProductCode)。 当屏幕第一次加载时,我正在使用下面的代码设置焦点此文本框及其工作正常。 我还需要在用户更改comboxbox中的值时设置焦点,但它似乎不起作用。

我在这里想念的是什么? (注意:我的第一个偏好是使用MVVM设计模式来实现此解决方案。如果它不起作用,我想采用代码隐藏方法。)

MainWindowResources.xaml

<Style TargetType="TextBox" x:Key="ProductCodeStyle">
        <Style.Triggers>
            <DataTrigger Binding="{Binding FocusOnProductCode}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

MainWindow.xaml:

<TextBox  Name="txtProductCode" HorizontalAlignment="Left" Height="22" TextWrapping="Wrap" Text="{Binding ProductCodeValue, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged }"   
                      VerticalAlignment="Top" Width="165" Style="{DynamicResource ProductCodeStyle}" Grid.Column="3" Margin="1,2,0,0" TabIndex="0" IsHitTestVisible="True"/>

MainWindowViewModel.cs

public MainWindowViewModel(MainWindow window)
{

this.FocusOnProductCode = true;
}


 public ProductType SelectedProductType
        {
            get
            {
                return m_selectedProductType;
            }
            set
            {                
                m_selectedProductType = value;

                this.FocusOnProductCode = true;

            }
        }



        public bool FocusOnProductCode
        {
            get { return m_focusOnProductCode; }
            set
            {
                m_focusOnProductCode;= value;
                OnPropertyChanged("FocusOnProductCode");
                OnPropertyChanged("SelectedProductType");
            }
        }

感谢。

1 个答案:

答案 0 :(得分:0)

通过在运行时动态设置样式设置器中的FocusManager.FocusedElement附加属性,将元素聚焦在纯XAML中无法工作,但您可以使用行为来设置一个布尔属性,指示该元素是否应该是重点放在视图模型类中,如以下主题所示:

Set focus on textbox in WPF from view model (C#)

How to set Focus to a WPF Control using MVVM?

<TextBox  Name="txtProductCode" Text="{Binding ProductCodeValue, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" local:FocusExtension.IsFocused="{Binding FocusOnProductCode}"/>