C# WPF MVVM ComboBox SelectedItem

Luk*_*por 1 c# wpf binding combobox mvvm

我知道它已经在这里出现了一百万次,但我不知道我的代码有什么问题。我尝试了一切,但ComboBox没有SelectedItem正确绑定。这是我完整的沙箱解决方案。您也可以在 GitHub ( https://github.com/LukasNespor/ComboBoxBinding )上找到它。

BindableBase.cs

public class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void RaisePropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

ContactModel.cs

public class ContactModel : BindableBase
{
    private int _Id;
    public int Id
    {
        get { return _Id; }
        set
        {
            _Id = value;
            RaisePropertyChanged(nameof(Id));
        }
    }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            RaisePropertyChanged(nameof(Name));
        }
    }

    private string _Phone;
    public string Phone
    {
        get { return _Phone; }
        set
        {
            _Phone = value;
            RaisePropertyChanged(nameof(Phone));
        }
    }

    public override bool Equals(object obj)
    {
        if (obj != null || !(obj is ContactModel))
            return false;

        return ((ContactModel)obj).Id == this.Id;
    }

    public override string ToString()
    {
        return $"{Name} {Phone}";
    }
}
Run Code Online (Sandbox Code Playgroud)

主窗口.xaml

<Window x:Class="WpfApplication1.MainWindow"
    ...>
<Grid>
    <ComboBox Width="200" Height="23"
              SelectedItem="{Binding ViewModel.SelectedContact}" ItemsSource="{Binding ViewModel.Contacts}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

主窗口.xaml.cs

public partial class MainWindow : Window
{
    public MainViewModel ViewModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        ViewModel = new MainViewModel();
        ViewModel.SelectedContact = new ContactModel
        {
            Id = 2,
            Name = "Some Guy",
            Phone = "+123456789"
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

主视图模型.cs

public class MainViewModel : BindableBase
{
    public List<ContactModel> Contacts
    {
        get
        {
            return new List<ContactModel>
            {
                new ContactModel() {Id = 1, Name = "John Doe", Phone = "+166666333" },
                new ContactModel() {Id = 2, Name = "Some Guy", Phone = "+123456789" }
            };
        }
    }

    private ContactModel _SelectedContact;
    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            RaisePropertyChanged(nameof(SelectedContact));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rom*_*Rom 7

您需要将列表与当前选定的项目同步:

1.XML:

<ComboBox ItemsSource="{Binding Contacts}" SelectedItem="{Binding SelectedContact}" IsSynchronizedWithCurrentItem="True" />
Run Code Online (Sandbox Code Playgroud)

2.视图模型:

public ObservableCollection<ContactModel> Contacts { get; set; }

    public MainViewModel()
    {
        _model = new Model {Name = "Prop Name" };
        Contacts = new ObservableCollection<ContactModel>
        {
            new ContactModel {Id = 1, Name = "John Doe", Phone = "+166666333"},
            new ContactModel {Id = 2, Name = "Some Guy", Phone = "+123456789"}
        };
        SelectedContact = Contacts[0];
    }

    private ContactModel _SelectedContact;

    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            OnPropertyChanged(nameof(SelectedContact));
        }
    }
Run Code Online (Sandbox Code Playgroud)