我有一个医生对象,其中一个属性是ObservableList
个诊所。它被用在窗口中以显示医生的详细信息。我可以将单个属性绑定到TextBox
和ComboBox
控件,但我无法获取要绑定到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)?
谢谢。
答案 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
的捷径。如果你想要更多,那么你需要个人控制。