同步ComboBox WPF,MVVM

时间:2016-06-15 09:57:10

标签: c# wpf mvvm

我也是WPF和MVVM的新手。对于我糟糕的英语也很抱歉。谢谢。

我需要创建两个同步的组合框。它们都具有14到80的值以及元素“Any”。当你在第一个组合框中选择(例如)20时 - 应该更新第二个组合框(值从20到80以及元素'Any')。当您在第二个组合框中选择(例如)30时 - 第一个组合框也应该更新(值从20到30以及元素'Any')。如果选择“任意” - 则表示值为14到80。

所以,我试着去做。它有效,但非常糟糕。当我在第一个组合框中选择40时 - 第二个组合框被更新(40-80 +'任意')。在它之后我在第一个组合框中选择50 - 而第二个没有更新。我不明白为什么。

ViewModelBase.cs 使用System.ComponentModel;

namespace WpfApplication3.ViewModel
{
    class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

MainWindowViewModel.cs

namespace WpfApplication3.ViewModel
{
    class MainWindowViewModel : ViewModelBase
    {
        private static readonly int MinAge = 14;
        private static readonly int MaxAge = 80;
        private static readonly string Any = "Any";

        private List<string> _fromValues = null;
        private List<string> _toValues = null;
        private string _from = null;
        private string _to = null;


        public List<string> FromValues
        {
            get
            {
                if ( _fromValues == null )
                    _fromValues = new List<string>();
                return _fromValues;
            }
        }

        public List<string> ToValues
        {
            get
            {
                if ( _toValues == null )
                    _toValues = new List<string>();
                return _toValues;
            }
        }

        public string From
        {
            get { return _from; }
            set
            {
                if ( _from == value )
                    return;
                _from = value;
                OnPropertyChanged(nameof(From));

                int min = _from == Any ? MinAge : int.Parse(_from);
                int max = MaxAge;

                ToValues.Clear();

                for ( int i = min; i <= max; i++ )
                    ToValues.Add(i.ToString());
                ToValues.Add(Any);

                OnPropertyChanged(nameof(ToValues));
            }
        }

        public string To
        {
            get { return _to; }
            set
            {
                if ( _to == value )
                    return;
                _to = value;
                OnPropertyChanged(nameof(To));

                int min = MinAge;
                int max = _to == Any ? MaxAge : int.Parse(_to);

                FromValues.Clear();

                FromValues.Add(Any);
                for ( int i = min; i <= max; i++ )
                    FromValues.Add(i.ToString());

                OnPropertyChanged(nameof(FromValues));
            }
        }

        public MainWindowViewModel()
        {
            FromValues.Add(Any);
            for (int i = MinAge; i <= MaxAge; i++ )
            {
                FromValues.Add(i.ToString());
                ToValues.Add(i.ToString());
            }
            ToValues.Add(Any);

            From = To = Any;
        }
    }
}

MainWindow.xaml.cs

namespace WpfApplication3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = new ViewModel.MainWindowViewModel();
            InitializeComponent();
        }
    }
}

MainWindow.xaml

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication3"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid Margin="4">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="5"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <ComboBox Grid.Column="0" IsEditable="False" ItemsSource="{Binding FromValues}" SelectedItem="{Binding From}"/>
        <ComboBox Grid.Column="2" IsEditable="False" ItemsSource="{Binding ToValues}" SelectedItem="{Binding To}"/>
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:0)

@Boopesh建议的ObservableCollection解决了我的问题。