WPF列表框绑定

Mik*_*ter 4 c# wpf binding listbox observablecollection

我有一个医生对象,其中一个属性是ObservableList诊所.它被用在窗口中以显示医生的详细信息.我可以获得单独的属性来绑定TextBoxComboBox控制,但我无法获得绑定到我的诊所列表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" />
Run Code Online (Sandbox Code Playgroud)

列表框正确填充ClinicList中的项目,ClinicList是所有可能诊所的列表.但是,我无法将医生对象中的诊所列表绑定,以便在列表框中选择它的项目.我也想反过来如果取消选择一个项目,医生对象中的ObservableList将相应地改变.

如何将我的医师对象中的ObservableList of Clinics双向绑定到我的Listbox中的Clinics列表(诊所对象的ObservableList)?

谢谢.

Phi*_*hil 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>
Run Code Online (Sandbox Code Playgroud)

查看型号:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 菲尔,谢谢你抽出时间回复,但我对你的回答有点失落,对不起.我列出了列表框中填充的所有诊所的完整列表,我想强调的是医生对象中诊所列表中的那些诊所.此外,如果我选择一个不在原始列表中,我想要添加,或者如果我取消选择我希望它从医生的诊所列表中删除.这可能是简单绑定无法完成的事情之一. (2认同)

pap*_*zzo 1

您将需要使用包含TextBox名称和ListBox诊所的模板,并且只需将内部ListBox路径绑定到诊所即可。 DisplayMemberPath是一个捷径单TextBox。如果您想要更多,那么您需要单独的控制。