WPF列表框绑定

时间:2012-02-20 21:15:01

标签: c# wpf binding listbox observablecollection

我有一个医生对象,其中一个属性是ObservableList个诊所。它被用在窗口中以显示医生的详细信息。我可以将单个属性绑定到TextBoxComboBox控件,但我无法获取要绑定到ListBox的诊所列表。

以下是我ListBox的xaml:

<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" />

Listbox正确填充ClinicList中的项目,ClinicList是所有可能诊所的列表。但是,我无法将医生对象中的诊所列表绑定,以便在列表框中选择它的项目。我也想采取另一种方式,如果取消选择一个项目,医生对象中的ObservableList将相应更改。

如何将我的医生对象中的诊所的ObservableList双向绑定到我的列表框中的诊所列表(诊所对象的ObservableList)?

谢谢。

3 个答案:

答案 0 :(得分:8)

迈克,你的绑定问题很少。 这是一个完整的样本,展示了一种做(我认为)你正在做的事情的方法。

查看:

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

请注意,对于读/写属性,您可能希望引发属性更改通知。

答案 1 :(得分:3)

您的问题是SelectedValue。在ListBox级别,不支持绑定到多个选择对象。使用绑定执行此操作的唯一真正方法是重新编写ViewModel,以便从绑定返回的诊所列表代表所有诊所,并且每个对象应该有IsSelected(或类似的东西)。

然后,您可以通过在ListBox节点中添加此XAML来使用样式来处理多项选择:

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

答案 2 :(得分:1)

您需要使用TextBox作为名称的模板和诊所的ListBox,然后将内部ListBox路径绑定到诊所。 DisplayMemberPath是单个TextBox的捷径。如果你想要更多,那么你需要个人控制。