WPF Listbox привязка - PullRequest
       27

WPF Listbox привязка

3 голосов
/ 21 февраля 2012

У меня есть объект врача, и одним из его свойств является ObservableList клиник. Он используется в окне, чтобы показать детали врача. Я могу настроить привязку отдельных свойств к элементам управления TextBox и ComboBox, но не могу получить список клиник для привязки к моим ListBox.

Вот xaml для моего ListBox:

<ListBox Height="318" 
 HorizontalAlignment="Left" 
 Margin="422,0,0,0" 
 Name="lbClinic" 
 VerticalAlignment="Top" 
 Width="158" 
 SelectedValue="{Binding ClinicID, Path=Clinics, Mode=TwoWay, 
                          UpdateSourceTrigger = PropertyChanged}"
 SelectedValuePath="ClinicID" 
 DisplayMemberPath="Name"
 ItemsSource="{Binding DataContext.ClinicList, 
                          ElementName = PhysicianInfoLookup, Mode = OneWay}" 
 SelectionMode="Multiple" />

Список правильно заполняется элементами из ClinicList, который является списком всех возможных клиник. Однако я не могу получить список Clinics из объекта врача для привязки, чтобы его элементы были выбраны в списке. Я также хочу пойти другим путем, и если элемент не выбран, ObservableList в объекте врача будет соответствующим образом изменен.

Как двусторонне связать ObservableList of Clinics в моем объекте врача со списком Clinics (ObservableList из объектов клиники) в моем Listbox?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 23 февраля 2012

Майк, у тебя мало проблем с привязками.Вот полный пример, демонстрирующий один из способов сделать то, что (я думаю) вы ищете.

Просмотр:

<Page.Resources>
    <ViewModel:Physician x:Key="physician"/>
</Page.Resources>
<StackPanel DataContext="{StaticResource physician}" >
    <TextBlock Text="{Binding Name}" Background="Orange"/>
    <TextBlock Text="Works in:"/>
    <ListBox ItemsSource="{Binding Clinics}" 
             SelectedValue="{Binding SelectedClinicId}" 
             SelectedValuePath="Id" DisplayMemberPath="Name" />
</StackPanel>

Просмотр модели:

public class Physician
{
    private int _selectedClinicId;

    public Physician()
    {
        Name = "Overpaid consultant";
        Clinics = new ObservableCollection<Clinic>
                      {
                          new Clinic {Id = 0, Name = "Out Patients"},
                          new Clinic {Id = 1, Name = "ENT"},
                          new Clinic {Id = 2, Name = "GE"},
                      };
    }

    public string Name { get; set; }
    public IEnumerable<Clinic> Clinics { get; private set; }

    public int SelectedClinicId
    {
        get { return _selectedClinicId; }
        set
        {
            if (value != _selectedClinicId)
            {
                Debug.WriteLine(string.Format("setting clinic to: {0}",value));
                _selectedClinicId = value;
            }
        }
    }
}

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

Обратите внимание, чтодля свойств чтения / записи вы, вероятно, захотите создать уведомления об изменении свойств.

3 голосов
/ 03 октября 2012

Ваша проблема SelectedValue.На уровне ListBox привязка к нескольким объектам выбора не поддерживается.Единственный реальный способ сделать это с привязками - это переработать вашу ViewModel так, чтобы список клиник, возвращаемых из привязки, представлял все клиник, и каждый объект там имел IsSelected (или что-то подобное)свойство.

Затем вы можете использовать стиль для обработки множественного выбора, добавив этот XAML в ваш узел ListBox:

<ListBox.ItemContainerStyle>
   <Style TargetType="{x:Type ListBoxItem}">
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
   </Style>
</ListBox.ItemContainerStyle>
1 голос
/ 21 февраля 2012

Вам нужно будет использовать шаблон с TextBox для имени и ListBox для клиник, и вы просто привязываете внутренний путь ListBox к клиникам.DisplayMemberPath - это короткий сингл TextBox.Если вы хотите больше, то вам нужен индивидуальный контроль.

...