2012-02-20 6 views
3

나는 의사 개체를 가지고 있으며 해당 속성 중 하나는 클리닉 중 ObservableList입니다. 의사의 세부 정보를 표시하기 위해 창에서 사용됩니다. TextBoxComboBox 컨트롤에 바인드 할 개별 속성을 가져올 수 있지만 내 ListBox에 바인드 할 클리닉 목록을 가져올 수 없습니다.WPF 목록 상자 바인딩

<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에서 항목 제대로 웁니다 : 여기

ListBox에 대한 XAML입니다. 그러나 의사 항목에서 클리닉 목록을 가져와 바인딩 할 수 없으므로 항목이 목록 상자에서 선택됩니다. 다른 방법으로 가고 싶습니다. 항목이 선택 해제되면 의사 객체의 ObservableList가 그에 따라 변경됩니다.

내 의사 개체의 ObservableList of Clinics를 내 Listbox의 Clinics (클리닉 개체의 ObservableList) 목록에 양방향 바인딩하려면 어떻게합니까?

감사합니다.

+0

당신이옵니다 모든 병원의 목록을 제시하고, 현재 의사의 사람들은 선택된 것으로 표시 의미합니까 :

그런 다음 ListBox 노드에서이 XAML을 추가하여 다중 선택을 처리하는 스타일을 사용할 수 있습니다 ? – NestorArturo

+0

아니요, 목록 상자에 모든 클리닉 목록이 표시됩니다. 의사 개체의 속성 인 클리닉 목록을 목록 상자에 바인딩하여 해당 클리닉이 선택되도록합니다. – MikeMalter

+0

VS 출력을 살펴보면 바인딩에 어떤 문제가 있는지 보여줍니다. – Snowbear

답변

1

이름에 TextBox, 임상 의학에 ListBox 인 템플릿을 사용해야하며 내부 ListBox 경로를 클리닉에 바인딩하면됩니다. DisplayMemberPath은 하나의 짧은 컷으로 TextBox입니다. 그 이상을 원한다면 개별 컨트롤이 필요합니다.

+0

당신은 정교 할 수 있습니까? 귀하의 답변을 주셔서 감사하지만 목록 상자에서 항목을 선택하는 것과 관련이 있는지 잘 모르겠습니다. 내가 놓친 게 있니? 감사. – MikeMalter

+1

BalamBalam의 의미는 목록 상자가 Clinic (이름, 주소, 사망률 등)의 더 많은 속성을 표시 할 수 있다는 것입니다.WPF의 목록 상자는 매우 유연하며 템플릿을 사용하여 거의 모든 것을 표시 할 수 있습니다. – Phil

+0

나는 여분의 생각에 감사하지만 그 중 아무 것도 필요하지 않습니다. 컬렉션을 Listbox에 바인딩하여 해당 항목을 선택하고 그 반대로 바인딩하는 방법에 대해 묻습니다. – MikeMalter

6

마이크, 바인딩에 약간의 문제가 있습니다. 다음은 내가 생각하는 것을 수행하는 한 가지 방법을 보여주는 완벽한 샘플입니다.

보기 :

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

참고.

+2

필 필자는 회신 할 시간을내어 줘서 고마워.하지만 나는 너의 대답으로 약간 길을 잃어. 미안. 나는 목록 상자가 채워지는 모든 진료소의 전체 목록을 가지고 있으며 의사 개체의 진료소 목록에있는 것들을 강조하고 싶습니다. 또한 원래 목록에없는 것을 하나 선택하면 추가하고 싶습니다. 선택을 취소하면 의사의 클리닉 목록에서 제거하고 싶습니다. 이것은 아마도 단순한 바인딩으로는 할 수없는 것들 중 하나 일 것입니다. – MikeMalter

3

귀하의 문제는 SelectedValue입니다. ListBox 수준에서는 여러 선택 개체에 대한 바인딩이 지원되지 않습니다. 바인딩을 사용하여이 작업을 수행하는 유일한 방법은 바인딩에서 반환 된 클리닉 목록이 모두 진료소를 나타내며 각 개체에 IsSelected (또는 이와 비슷한) 속성이 있어야하도록 ViewModel을 다시 제작하는 것입니다.

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
    </Style> 
</ListBox.ItemContainerStyle>