4

(これを何日も浸透させた後に思いついた私自身の答えについては、以下を参照してください)私はWPFで次のシナリオを達成しようとしています。

表示および追加のデータ入力のためにデータの行を表示しているデータグリッドがあります。これは新しいアプリですが、レガシーデータがあります。

過去のある特定のフィールドには、ランダムにデータが入力されていました。次に、そのフィールドの値を特定のリストに制限します。だから私はDataGridComboBoxColumnを使用しています。FWIW代わりに、ComboBoxを含むDataGridTemplateColumnでこれを試しました。

実行時に、既存の値がリストにない場合は、とにかく表示したいと思います。私はそれを実現させることができないようです。私は膨大な数の解決策(すべての失敗)を試みましたが、ここが出発点として最も論理的なものです。

ドロップダウンの値のリストは、「月」と呼ばれるWindowsリソースで定義されます。

<DataGridComboBoxColumn x:Name="frequencyCombo"   MinWidth="100" Header="Frequency"
   ItemsSource="{Binding Source={StaticResource months}}"
   SelectedValueBinding="{Binding Path=Frequency,UpdateSourceTrigger=PropertyChanged}">
   <DataGridComboBoxColumn.ElementStyle>
     <Style TargetType="ComboBox">
       <Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
     </Style>
   </DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>

何が起こっているのかというと、値がリストにない場合、表示は空白になります。実行時に、IsSynchronizedWithCurrentItem要素が実際にFalseであることを確認しました。それは私が期待していることをしていないだけです。

たぶん私はここで間違った道を進んでいるだけです。たぶん、コンボボックスと組み合わせてテキストボックスを使用する必要があります。XAMLだけでなく、コードを書く必要があるかもしれません。私はさまざまなことを試すのに何時間も費やしてきましたが、解決策に本当に感謝しています。このクラスまたはそのコントロールを使用するためのいくつかの提案がありましたが、使用方法の説明はありません。

本当にありがとう!

4

5 に答える 5

5

私はついにこれを解決しました。秘訣は、コンボボックス列を取り除き、表示用のテキスト ボックスと編集用のコンボ ボックスを持つテンプレートを使用することです。しかし、私はまだ新しい問題に何時間も費やしました...コンボボックスで選択を行うと、グリッドでコンボボックスを使用した他の行が変更されます。何が問題を解決したと思いますか。以前使用しようとしていた IsSynchronizedWithCurrentItem プロパティ。:)

 <DataGridTemplateColumn x:Name="frequencyCombo" Header="Frequency">
   <DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
       <TextBlock Text="{Binding Path=Frequency}" />
     </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
   <DataGridTemplateColumn.CellEditingTemplate>
   <DataTemplate>
     <ComboBox 
       ItemsSource="{Binding Source={StaticResource frequencyViewSource},
       TargetNullValue=''}"
       SelectedItem="{Binding Path=Frequency}" IsSynchronizedWithCurrentItem="False"
      />
    </DataTemplate>
  </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

醜いハックはありません。ドロップダウンの下部にぶら下がっている使用できない選択肢はありません。これらの余分な値を追加してからクリーンアップするコードはありません。

マークの提案に対する「回答」を削除するつもりはありません。これにより、アプリをクライアントの手に渡せるようになりましたが、これが私が探していたソリューションです。何時間もウェブ検索した後、「接続」アイ​​テムに埋もれていることがわかりました。

みんなの助けに感謝します!

于 2011-01-19T15:06:51.477 に答える
0

次のようなことをしてみませんか。

//create collection
PagedCollectionView view = new PagedCollectionView(e.Result);
view.SortDescriptions.Add(
new SortDescription("Months", ListSortDirection.Ascending));
gridProducts.ItemsSource = view;

//filter collection by category
PagedCollectionView view = new PagedCollectionView(e.Result);
view.Filter = delegate(object filterObject)
{
    Product product = (Product)filterObject;
    return (product.CategoryName == "Legacy");
};
gridProducts.ItemsSource = view;

//create categories through grouping
PagedCollectionView view = new PagedCollectionView(e.Result);
view.GroupDescriptions.Add(new PropertyGroupDescription("Legacy"));
view.GroupDescriptions.Add(new PropertyGroupDescription("etc..."));
gridProducts.ItemsSource = view;
于 2011-01-15T20:10:47.663 に答える
0

ここで何が起こっているのかを明確にしていただけますか? 実行時に「既存の値」が何であるかは不明です-これがデータがランダムに入力されるフィールドである場合、それを制限することにより、表示したいにもかかわらず、何らかの検証ロジックを実行していることを意味しますか?

また、私は Silverlight 側にいます... WPF もデフォルトで一方向バインディングですか?

于 2011-01-15T15:58:26.167 に答える
0

これを試して:

    <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Months}"
                                  Text="{Binding Value}"
                                  IsEditable="True" />

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
于 2011-01-15T21:15:53.980 に答える
0

リストのアイテムのソースとして静的リソースとビュー モデル プロパティを混在させるのではなく、ビュー モデルで ObservableCollection または CollectionViewSource を使用してみましたか? 次に、非標準アイテムを自由に挿入および削除し、必要なときにいつでも選択する (または選択しない) ことができます。したがって、「通常の」リストには通常の月が含まれますが、奇妙な月が来たら、それをリストに追加して選択します。ビューモデルで排他的に制御する方が簡単なようです。

于 2011-01-15T16:31:21.557 に答える