如何将组合框文本绑定到不在下拉列表中的遗留数据



我的组合框的下拉列表(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>

相关内容

  • 没有找到相关文章

最新更新