我最近在这里问了一个问题,结果是以下代码:
<ComboBox x:Name="cmbTarget" SelectedItem="{Binding TriggerTarget}" SelectionChanged="cmbTarget_SelectionChanged">
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=cmbTargetType}" Value="Material">
<Setter Property="ItemsSource" Value="{Binding DataContext.MaterialListViewModel.MaterialViewModels.AllMaterials, RelativeSource={RelativeSource AncestorType=Window}}" />
</DataTrigger>
<DataTrigger Binding="{Binding Text, ElementName=cmbTargetType}" Value="ProductPart">
<Setter Property="ItemsSource" Value="{Binding DataContext.ProductViewModel.ProductPartViewModels.AllProductParts, RelativeSource={RelativeSource AncestorType=Window}}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
简单地说,ComboBox cmbTarget的ItemsSource是根据ComboBox cmbTargetType的值设置的。此代码完美地工作,而AllProductParts和AllMaterials的结果是字符串的集合,在这种情况下,是集合中对象的名称。但是,我意识到我不希望这些结果成为一个字符串。我想使用对象本身,所以我可以将它们传递给我附加的ViewModel对象。但是,这自然会导致ComboBox只显示一个类名列表。
有没有办法让这个ComboBox显示ProductPart / Material的InternalName变量,同时让它以实际的ProductPart / Material对象的形式与它的ViewModel进行通信?
我尝试使用Converter类。但似乎这些与程序的其他部分完全断开,这意味着我无法访问代码的其他部分来尝试找到属于InternalName的正确对象。
答案 0 :(得分:4)
您在组合框元素中缺少DisplayMemberPath。 将DisplayMemberPath设置为视图模型属性对象的字符串成员。
在这种情况下,您要将路径设置为&#34; InternalName&#34;