我知道已经到过一百万次了,但是我不知道我的代码有什么问题。我尝试了所有操作,但ComboBox未正确绑定(bind)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));
    }
}

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}";
    }
}

MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
    ...>
<Grid>
    <ComboBox Width="200" Height="23"
              SelectedItem="{Binding ViewModel.SelectedContact}" ItemsSource="{Binding ViewModel.Contacts}" />
</Grid>

MainWindows.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"
        };
    }
}

MainViewModel.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));
        }
    }
}

最佳答案

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

1.Xaml:

<ComboBox ItemsSource="{Binding Contacts}" SelectedItem="{Binding SelectedContact}" IsSynchronizedWithCurrentItem="True" />

2.ViewModel:
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));
        }
    }

关于c# - C#WPF MVVM ComboBox SelectedItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39981589/

10-13 09:41