Двухстороннее связывание ComboBox не работает - PullRequest
2 голосов
/ 11 января 2011

Эти комбо-боксы меня всегда сбивают с толку.Я думаю, что понимаю их, но мне кажется, что я не понимаю.

Я бы не смог дать объект родителю.Итак, у меня есть этот дочерний объект, у него есть значение, которое является идентификатором родителя, и у меня есть коллекция родительских элементов.

Я выбираю Parent из ComboBox и, если я правильно понимаю, это свойство ID должнобыть привязанным к свойству Child's ParentId.Кажется, хорошо, когда я выбираю его, свойство переходит.Шаблон изменен и отображается как текстовый блок, все хорошо.когда шаблон возвращается в тип ComboBox, внезапно он становится нулевым.Разве он не должен найти сопоставимый элемент в коллекции, где его идентификатор соответствует ParentId?

Вот код:

PARENT

public class Parent
{
    private string _id;
    public string Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("Id");
        }
    }

    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
}

РЕБЕНОК

public class RulesMainClassViewModel : ViewModelBase
{
    private string _id;
    public string Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("Id");
        }
    }

        private string _parentId;
    public string ParentId
    {
        get
        {
            return _parentId;
        }
        set
        {
            _parentId = value;
            OnPropertyChanged("ParentId");
        }
    }

    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
}

XAML комбинированный список

<ComboBox DisplayMemberPath="Name" SelectedValue="{Binding Path=ParentId, Mode=TwoWay}" 
SelectedValuePath="Id" ItemsSource="{Binding Path=ParentCollection}" />

1 Ответ

0 голосов
/ 11 января 2011

Не уверен, на что похожа ваша полная настройка (и я не могу точно сказать, что не так с вашим кодом), но я попытался смоделировать что-то похожее, что имеет общее использование, я сделал ListView, который привязывается к коллекции сотрудники, которые имеют Name и Occupation. ComboBox имеет целью изменить Occupation выбранного сотрудника, XAML для него выглядит так:

    <ComboBox ItemsSource="{Binding Occupations}"
              SelectedValue="{Binding ElementName=lv,Path=SelectedItem.Occupation}"
              SelectedValuePath="{Binding Occupation.Title}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

Кажется, это работает. Обратите внимание, что мой SelectedValuePath является обязательным, может быть, это проблема ...


(Коды классов:)

public class Employee : INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; 
        NotifyPropertyChanged("Name");}
    }

    private Occupation occupation;
    public Occupation Occupation
    {
        get { return occupation; }
        set { occupation = value; 
        NotifyPropertyChanged("Occupation");}
    }

    public Employee(string name, Occupation occupation)
    {
        this.name = name;
        this.occupation = occupation;
    }

    #region INotifyPropertyChanged Members
    ...
    #endregion
}

public class Occupation : INotifyPropertyChanged
{
    private string title;
    public string Title
    {
        get { return title; }
        set { title = value; 
        NotifyPropertyChanged("Title");}
    }

    public Occupation(string title)
    { Title = title; }

    #region INotifyPropertyChanged Members
    ...
    #endregion
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...