2

我的组合框的下拉列表 (itemssource) 包含新产品请求项目。我想绑定到不在下拉列表中的旧数据。为了使事情复杂化,我使用多重绑定和 IMultiValueConverter 来组合显示字段。此外,绑定字段的名称与我绑定的属性名称不匹配。

组合框 itemssource 是 NewProductRequests 的列表。从此 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>

我使用基于来自 Julie Lerman的MSDN Magazine 示例的 DataGridTemplateColumn.CellEditingTemplate 解决了与数据网格和组合框类似的问题。当然,在这种情况下,我没有使用数据网格。

提前感谢您的帮助。

4

2 回答 2

1

这个答案(对我自己的问题)是从 NathanAW 答案中的评论中提取的:

不幸的是,我不能在 ItemsSource 中包含旧项目。该列表来自我无法控制的 Web 服务。我设计了一个我不太喜欢的笨拙的解决方案(但它有效)......因为我知道只有新记录才需要组合框,它只有在用户单击“添加”时才可见。在同一位置,我放置了一个文本框,该文本框绑定到未处于添加模式时可见的旧数据。因此,当应用程序进入和退出添加模式时,我会切换每个控件的可见性。我相信有更好的方法!

于 2012-05-11T20:56:42.423 回答
0

似乎您可以通过不使用多绑定转换器来简化这一点。如果您有 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 对象的其他属性,则可以向模板添加一个附加部分。

请注意,“选定”项被双向绑定到 ViewModel 上的属性(或代码隐藏,或其他)。这将是这样的:

public NPR SelectedNPR
{
   get { ... }
   set 
   {
       ...
       // don't forget INotifyPropertyChanged
       ...
   }
}

编辑

这是一个示例,似乎可以按照您的指示在“选择框”中显示旧数据,但不在下拉列表中。要对此进行测试,请尝试在 KaXaml 或其他工具中运行它。然后开始输入“Hello 3”并看到它建议“Hello 30”。这表明 Combo 知道该项目。现在下拉列表,看看它不在列表中。如果您使用箭头键向下箭头,它会从“Hello 20”跳到“Hello 40”。

下一步是设置您的模板,以便 ListBoxItem 模板的 Visibility 绑定到 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>
于 2011-07-11T16:10:51.480 回答