WPF ComboBox: привязать выбранный элемент к члену класса - PullRequest
0 голосов
/ 14 мая 2019

У меня есть класс Person с Id (Int32) и Именем (String).Имена коллекции Persons отображаются в ComboBox (DisplayMemberPath = "Name").Я хочу привязать идентификатор выбранного элемента к свойству Int32 SelectedId в модели представления.

Я пробовал SelectedValue = "{Binding Path = SelectedId, Mode = TwoWay}" и SelectedValuePath = "{Binding Path = SelectedId, Mode= TwoWay} ", оба не работают.

<ComboBox Name="cmbPersons"
    ItemsSource="{Binding Source={StaticResource vm},Path=Persons}"
    DisplayMemberPath="Name"
    SelectedValue="Id"
    SelectedValue="{Binding Path=SelectedId, Mode=TwoWay}"
/>

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

В случае, если речь идет прежде всего о получении выбранного элемента, а не о привязке.

Вы можете получить выбранный элемент, не привязывая его к дополнительному свойству. Вы можете использовать ICollectionView, чтобы получить событие в модели представления, когда выбран другой элемент.

Код для модели представления

List<PersonVm> personVms;
private ICollectionView _persons;

public ICollectionView Persons
{
    get => _persons;
    set
    {
        if (Equals(value, _persons)) return;
        _persons = value;
        OnPropertyChanged();
    }
}

// call this method in the constructor of the viewmodel
private void Init(){
    // TODO You have to add items to personVms before creating the collection

    Persons = new CollectionView(personVms);

    // Event when another item gets selected
    Persons.CurrentChanged += PersonsOnCurrentChanged;

    // moves selected index to postion 2
    Persons.MoveCurrentToPosition(2); 
}

private void PersonsOnCurrentChanged(object sender, EventArgs e)
{
    // the currently selected item
    PersonVm personVm = (PersonVm)Persons.CurrentItem;

    // the currently selected index
    int personsCurrentPosition = Persons.CurrentPosition;
}

1009 * XAML *

<ComboBox 
    ItemsSource="{Binding Persons}" 
    DisplayMemberPath="Name"/>
0 голосов
/ 14 мая 2019

Попробуйте это.

SelectedValue="{Binding SelectedId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Id"

Обновление:

Я подготовил образец, который работает нормально. Я надеюсь, что это прояснит вас. (Реализуйте INotifyPropertyChanged самостоятельно)

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public ObservableCollection<Person> Persons { get; set; }
    public int SelectedId { get; set; }
    public MainWindow()
    {
        InitializeComponent();

        DataContext = this;

        Persons = new ObservableCollection<Person>
        {
            new Person { Id = 1, Name = "Raj" },
            new Person { Id = 2, Name = "Ram" }
        };
    }
}

Person.cs:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

MainWindow.xaml:

   <ComboBox Width="100" Height="30" ItemsSource="{Binding Persons}" DisplayMemberPath="Name" SelectedValue="{Binding SelectedId}" SelectedValuePath="Id"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...