2

コンボボックスのドロップダウン リスト (itemssource) に、新しい製品リクエスト アイテムが含まれています。ドロップダウン リストにないレガシー データにバインドしたいと考えています。複雑にするために、IMultiValueConverter でマルチバインディングを使用してフィールドを結合して表示しています。また、バインドされたフィールドの名前が、バインドされているプロパティの名前と一致しません。

コンボボックスの itemssource は、NewProductRequests のリストです。この NPR オブジェクトから NewProdNumber と NewProdName が結合され、型コンバーターによってドロップダウン リストに表示されます。ConvertBack メソッドは、値 NewProdNumber および NewProdNumberCombinedWithName を返します。これら 2 つの値は、わずかに異なる名前でデータベース フィールドに保存されます。この例では、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

Multi-Binding コンバーターを使用しないことで、これを単純化できるようです。NPR オブジェクトのコレクションがある場合は、それをリストボックスの ItemsSource として設定できます。次に、DataTemplate を使用して、そのアイテムの表示方法をフォーマットします。

このセットアップでは、次のようなものを使用して、NPR オブジェクトの複数のフィールドを単一の TextBlock に表示するテンプレートを構築できます。

<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
       ...
   }
}

編集

「SelectionBox」にレガシーデータを表示することについて起訴されたが、ドロップダウンリストには表示されないように見えるサンプルを次に示します。これをテストするには、KaXaml などで実行してみてください。次に、「Hello 3」と入力し始めると、「Hello 30」が表示されることがわかります。これは、コンボがアイテムについて知っていることを示します。リストをドロップダウンして、リストにないことを確認します。矢印キーで下向きにすると、「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 に答える