Привязка выбранного элемента ComboBox - PullRequest
1 голос
/ 28 июня 2019

У меня есть ComboBox в моем Просмотр :

<ComboBox Name="comboBox1" ItemsSource="{Binding MandantList}" SelectedItem="{Binding CurrentMandant, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Firma}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Вот моя Модель :

public class MandantListItem : INotifyPropertyChanged
{
    public MandantListItem() { }

    string _Firma;
    bool _IsChecked;

    public string Firma
    {
        get { return _Firma; }
        set { _Firma = value; }
    }
    public bool IsChecked
    {
        get
        {
            return _IsChecked;
        }
        set
        {
            _IsChecked = value;
            OnPropertyChanged(nameof(IsChecked));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

А вот и моя ViewModel :

public class MaViewModel : INotifyPropertyChanged
{
    public ObservableCollection<MandantListItem> MandantList { get { return _MandantList; } }
    public ObservableCollection<MandantListItem> _MandantList = new ObservableCollection<MandantListItem>();

    private MandantListItem _CurrentMandant;
    public MandantListItem CurrentMandant
    {
        get { return _CurrentMandant; }
        set
        {
            if (value != _CurrentMandant)
            {
                _CurrentMandant = value;
                OnPropertyChanged("CurrentMandant");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Как заполнить поле со списком:

public zTiredV2.ViewModel.MaViewModel MAList = new zTiredV2.ViewModel.MaViewModel();
this.comboBox1.ItemsSource = MAList.MandantList;
MAList.MandantList.Add(new zTiredV2.Model.MandantListItem { Firma = "A", Homepage = "a.com", IsChecked = false });
MAList.MandantList.Add(new zTiredV2.Model.MandantListItem { Firma = "B", Homepage = "b.com", IsChecked = false });

Но мой элемент не обновляется ... пробовал также через IsChecked, но тоже безуспешно ... когда я перебираю MAList, IsChecked всегда ложно. И как я могу привязать TextBlock к выбранной Фирме?

Трудно с MVVM, но мне это нравится.

1 Ответ

1 голос
/ 28 июня 2019

Вы должны установить DataContext из ComboBox для экземпляра вашей модели представления.В противном случае привязки не будут работать:

this.comboBox1.DataContext = MAList;

Также обратите внимание, что поле поддержки _MandantList для вашей собственности не должно быть публичным.На самом деле это вообще не нужно:

public ObservableCollection<MandantListItem> MandantList { get; } = new ObservableCollection<MandantListItem>();

Установка DataContext должна привести к установке свойства CurrentMandant при выборе элемента в ComboBox.Однако он не установит свойство IsChecked.

...