WPF通过MVVM以编程方式更改ComboBox用户选择和焦点

时间:2016-11-06 14:56:06

标签: c# wpf mvvm combobox textbox

在我的MVVM应用程序中,我有一个文本框和一个组合框。

用户在文本框和组合框下拉列表中输入一个数值(在文本框输入时),用户从组合框中选择一个级别(他不能自己打开组合框)。

我想检查两个输入并相应地更改组合框。

例如,如果用户将文本框设置为1200.5 mV,我会将文本框更改为1.0,将组合框更改为V.

问题1:

如何以编程方式更改组合框SelectedValue,以便用户可以看到新值?

问题2:

如何下​​拉组合框,但仍然将焦点放在文本框上(即使我的鼠标光标位于组合框下拉列表中)?在组合框中首次选择后,我似乎失去了对文本框的关注。

感谢。

XAML:

<Grid >

    <StackPanel Orientation="Horizontal">

        <TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Height="25" Width="100" 


                 />


        <ComboBox 
            IsDropDownOpen="{Binding IsDropDownOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
            ItemsSource="{Binding OffsetValues}"
            SelectedValue="{Binding NodeCategory, Mode=TwoWay}" 

            Height="25" Width="100" IsHitTestVisible="False" Background="AliceBlue">
            <ComboBox.Resources>
                <sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">0</sys:Double>
            </ComboBox.Resources> 
        </ComboBox>
    </StackPanel>


</Grid>

视图模型:

class ViewModel : ViewModelBase
{


    private IList<string> offsetValues =  new List<string>() { "mV", "V" };
    public IList<string> OffsetValues
    {
        get
        {
            return offsetValues;
        }
        set
        {
            offsetValues = value;
        }
    }




    private bool isDropDownOpen;

    public bool IsDropDownOpen
    {
        get { return isDropDownOpen; }
        set
        {
            isDropDownOpen = value;
            OnPropertyChanged();
        }
    }


    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {

            _name = value;
            OnPropertyChanged( "Name" );

            if( _name != "" )
            {
                isDropDownOpen = true;
                OnPropertyChanged( "IsDropDownOpen" );
            }

        }
    }




    private string _NodeCategory;
    public string NodeCategory
    {
        get
        {
            return _NodeCategory;
        }
        set
        {
            if( Convert.ToDouble( _name ) > 1000 )
            {
                _name = "1.0";
                OnPropertyChanged( "Name" );




                _NodeCategory = OffsetValues[1];



                OnPropertyChanged( "NodeCategory" );


            }
            else
            {


                _NodeCategory = value;
                OnPropertyChanged( "NodeCategory" );

            }



        }
    }





}


public class ViewModelBase : INotifyPropertyChanged
{
    protected virtual void OnPropertyChanged( [CallerMemberName]string propertyName = null )
    {
        PropertyChanged.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
    }

    public event PropertyChangedEventHandler PropertyChanged;


}

1 个答案:

答案 0 :(得分:0)

在文本框中添加双向绑定到viewmodel中的属性

在属性的setter中(表示文本框值已更新)更改nodecategory和offsetvalues的值...提高两者的属性更改

这应该有效

我正在通过手机打字,因此无法添加示例。

希望这有帮助