【发布时间】:2013-08-13 00:34:17
【问题描述】:
您好,感谢您的帮助。
以下 xaml 可以正常工作:
<ComboBox Name="cboCit_type"
IsSynchronizedWithCurrentItem="True"
mvvm:View.FlowsWithPrevious="True"
ItemsSource="{Binding Path=cuCodeInfo.CitTypes}"
SelectedValuePath="code"
DisplayMemberPath="code"
Text="{Binding cit_type}"
IsEditable="true"
IsReadOnly="false"
SelectedValue="{Binding Path=cit_type}">
</ComboBox>
cuCodeInfo.CitTypes 只是一个可用项目的列表。有许多公共属性,但有问题的 2 个是“代码”和“描述”。
现在,我显示可用的代码值,用户选择一个。如果已经选择了一个,那么它会在页面显示时显示。这一切都很好。
然后我认为同时显示代码和描述可能会很好。我觉得应该不会太难...
所以我删除了 DisplayMemberPath 语句并添加到 ItemTemplate 中。
当我这样做时,一切看起来都很棒,直到我尝试从列表中选择一个项目。当我这样做时,我会得到一个空字符串,而不是显示选定的代码。我已经搜索了互联网,试图找到我需要添加到 DataTemplate 来解决这个问题的一件事,但是我尝试过的一切都失败了。这是不工作的代码:
<ComboBox Name="cboCit_type"
IsSynchronizedWithCurrentItem="True"
mvvm:View.FlowsWithPrevious="True"
ItemsSource="{Binding Path=cuCodeInfo.CitationTypes}"
SelectedValuePath="code"
Text="{Binding cit_type}"
IsEditable="true"
IsReadOnly="false"
SelectedValue="{Binding cit_type}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Border BorderThickness="0,0,1,0" BorderBrush="Black">
<TextBlock Text="{Binding Path=code}" mvvm:View.WidthEx="2" ></TextBlock>
</Border>
<TextBlock Text="{Binding Path=description}" mvvm:View.WidthEx="15" Margin="1" ></TextBlock>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
任何帮助将不胜感激。
顺便说一句,我必须在多种形式中使用这种完全相同的格式(相同的列表等,只是不同的 SelectedValue)——因此,如果您想建议在 xaml 中执行此操作的最佳方法,那就太好了.在我之前的 xaml 时代,我只会创建一个控件,设置一个属性或 2,然后在我的所有表单中使用它。但我应该使用 xaml,所以不确定最好的方法。
谢谢!
【问题讨论】:
-
使用 SelectedItem 代替 SelectedValue
-
效果更好,但现在我看到的是 Listed 对象的名称,而不是值。看来它正在返回对象,而不是 SelectedValuePath 中的值。
-
您可以在代码中从该对象中提取该值
-
但是用户不会理解显示部分的对象名称代表数据。我只想显示“代码”值,而不是类的名称。
-
IOW,我希望它像第一个示例一样工作,只显示 2 列而不是 1 列。我不敢相信我必须使用代码隐藏来获得该 UI。