wpf datagridcomboboxcolumnのIssynChronizedWithCurrentITemを使用します
-
11-10-2019 - |
質問
(この数日と数日間この浸透した後に思いついた私自身の答えについては、以下を参照してください)WPFで次のシナリオを達成しようとしています。
表示のためのデータの行と追加のデータ入力を表示しているデータグリッドがあります。新しいアプリですが、レガシーデータがあります。
過去の特定の分野では、データがランダムに入力されています。次に、そのフィールドの値を特定のリストに制限したいと考えています。だから私はdatagridcomboboxcolumnを使用しています。 fwiw私は、コンボボックスを含む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要素が実際に偽であることを確認しました。それは私が期待していることをしていないだけです。
おそらく私はここで間違った道を歩んでいるだけです。コンボボックスと組み合わせてテキストボックスを使用する必要があるかもしれません。たぶん、xamlだけでなく、いくつかのコードを書く必要があるかもしれません。私はさまざまなことを試して何時間も費やしてきましたが、解決策に本当に感謝しています。私はこのクラスまたはそのコントロールを使用するためにいくつかの提案をしましたが、説明なしで どうやって それを使用する。
本当にありがとう!
解決
私はついにこれを解決しました。トリックは、コンボボックスコラムを取り除き、表示用のテキストボックスと編集用のコンボボックスを備えたテンプレートを使用することです。しかし、私はまだ新しい問題で何時間も費やしました...コンボボックスで選択を行うとき、それはグリッドでコンボボックスを使用した他の行を変更します。問題を解決したものを推測してください!私が以前に使用しようとしていた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>
醜いハックはありません。ドロップダウンの下部にぶら下がっている使用不可能な選択はありません。これらの追加値を追加してからクリーンアップするコードはありません。
マークの提案について「答え」を取り除くつもりはありません。なぜなら、アプリをクライアントの手に渡すことができたからですが、これは私が探していた解決策です。私はそれが埋葬されていることを発見しました」接続「ウェブ検索の数時間後のアイテム。
みんな助けてくれてありがとう!
他のヒント
ここで何が起こっているのかを明確にしていただけませんか? 「既存の値」が実行時に何であるかは不明です。これがデータがランダムに入力されているフィールドである場合、これを制限することで、これは何らかの検証ロジックを実行していることを意味しますが、まだ表示したいのですか?
また、私は物事のシルバーライトの側面にもっといます... WPFはデフォルトの片道バインディングもデフォルトですか?
静的リソースとビューモデルプロパティをリストのアイテムのソースとして混合するのではなく、ビューモデルで観察viewsourceを使用してみましたか?次に、非標準のアイテムを自由に挿入して削除し、いつでも好きなときに選択(またはそうでない)を削除することができます。したがって、「通常の」リストには通常の月がありますが、奇妙なリストが来たら、それをリストに追加して選択します。ビューモデルでのみ制御する方が簡単だと思われます。
どうでした。
//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;
これを試して:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Months}"
Text="{Binding Value}"
IsEditable="True" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>