我也是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>
答案 0 :(得分:0)
@Boopesh建议的ObservableCollection解决了我的问题。