我的组合框的下拉列表(itemssource)包含新的产品请求项。我想绑定到不在下拉列表中的遗留数据。为了使事情复杂化,我使用multibinding和multivalueconverter来组合要显示的字段。此外,绑定字段的名称与我绑定到的属性的名称不匹配。
组合框itemssource是一个新产品请求列表。从这个NPR对象中,NewProdNumber和NewProdName通过类型转换器组合在下拉列表中显示。ConvertBack方法返回值NewProdNumber和NewProdNumberCombinedWithName。这两个值将被保存到名称略有不同的数据库字段中。在这个例子中,我将它们命名为DBProdRequestNumber和DBProdRequestTitle。
我已经成功地显示并保存了新项目。问题是我还没有弄清楚如何显示不在列表中的遗留数据。它不在列表中是因为它不再符合新产品请求的资格。
这里是问题XAML (itemssource是在代码后面设置的):<ComboBox x:Name="NPRComboBox" IsSynchronizedWithCurrentItem="False" IsEditable="False">
<ComboBox.SelectedItem>
<MultiBinding Converter="{StaticResource combineNPRStuffMultiConverter}">
<Binding Path="DBProdRequestNumber" UpdateSourceTrigger="PropertyChanged"/>
<Binding Path="DBProdRequestTitle" UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource combineNPRStuffMultiConverter}">
<Binding Path="NewProdNumber" UpdateSourceTrigger="PropertyChanged"/>
<Binding Path="NewProdNumberCombinedWithName" UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我使用DataGridTemplateColumn解决了数据网格和组合框的类似问题。CellEditingTemplate基于这个MSDN杂志的例子从Julie Lerman。当然,在本例中我没有使用数据网格。提前感谢您的帮助。
这个答案(对我自己的问题)是从NathanAW回答的评论中摘录的:
不幸的是,我不能在ItemsSource中包含遗留项目。这份名单来自一个我无法控制的网络服务。我设计了一个我不太喜欢的笨拙的解决方案(但它有效)……因为我知道组合框只需要新的记录,它是可见的,只有当用户单击"添加"。在同一位置,我放置了一个绑定到遗留数据的文本框,该文本框在非添加模式下可见。所以,当应用程序切换到或退出添加模式时,我切换每个控件的可见性。我相信有更好的方法!
似乎可以通过不使用多绑定转换器来简化这一点。如果您有一个NPR对象的集合,那么您可以将其设置为列表框的ItemsSource。然后使用DataTemplate来设置该项的显示方式。
有了这样的设置,您就可以构建一个模板,在单个TextBlock中显示NPR对象的多个字段,使用如下内容:
<ComboBox
x:Name="NPRComboBox"
IsSynchronizedWithCurrentItem="False"
IsEditable="False"
SelectedItem={Binding SelectedNPR, Mode=TwoWay}"
>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding Path=NewProdNumber, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
<Run> - </Run>
<Run Text="{Binding Path=NewProdNumberCombinedWithName, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如果你想访问NPR对象的其他属性,你可以在模板中添加一个额外的部分。
注意,"selected"项被双向绑定回ViewModel(或代码隐藏,或其他)上的属性。就像这样:
public NPR SelectedNPR
{
get { ... }
set
{
...
// don't forget INotifyPropertyChanged
...
}
}
编辑
这是一个例子,似乎做什么你已经起诉显示遗留数据在"选择框",但不是在下拉列表。要测试这一点,请尝试在KaXaml或其他东西中运行它。然后开始输入"Hello 3",看到它提示"Hello 30"。这表明Combo知道这个项目。现在向下拉列表,看看它是否不在列表中。如果你用方向键向下移动,它会从"Hello 20"跳到"Hello 40"。
下一步是设置你的模板,使ListBoxItem模板的可见性绑定到NPR对象上的"IsLegacy"。然后将遗留项和新项添加到ItemsSource集合并绑定到列表。
<ComboBox IsEditable="True">
<ComboBoxItem >Hello 10</ComboBoxItem>
<ComboBoxItem >Hello 20</ComboBoxItem>
<ComboBoxItem Visibility="Collapsed">Hello 30</ComboBoxItem>
<ComboBoxItem >Hello 40</ComboBoxItem>
</ComboBox>