私はこれを持っていますListView
、主に各要素は2列DataGrid
で構成されています。私はListView
要素の1..nのオペレータ/値のペアを指定するDataGrid
を使用DataGridComboBoxColumnを辞書にバインドする
<ListView Name="SelectedWhereItemListView"
ItemsSource="{Binding AddedWhereItems}"
VerticalContentAlignment="Top">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding TableName}" />
<TextBlock Text="{Binding ColumnName}" />
<DataGrid SelectionMode="Single" AutoGenerateColumns="False" ItemsSource="{Binding WhereFieldCondition}">
<DataGrid.Columns>
<DataGridComboBoxColumn Width="Auto" Header="{lex:Loc Key=Operator}" SelectedValueBinding="{Binding Operator}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.WhereFieldConditions[DataType], RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.WhereFieldConditions[DataType], RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn Width="Auto" Header="{lex:Loc Key=Value}" Binding="{Binding Value}" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
。現在のグラフィカルな結果以下
、ちょうどより具体的なアイデアを持っている
ListView
の各要素は、最終的に生成されたクエリのWHERE句です。各ブロックにはデータ型(int、varcharなど)があります。 ListView要素のデータ型に基づいて、データグリッドのDataGridComboBoxColumn
オペレータを記入したいと思います。
私は、私は次の例外
System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'ObservableCollection`1') from 'WhereFieldConditions' (type 'Dictionary`2'). BindingExpression:Path=DataContext.WhereFieldConditions[.DataType]; DataItem='StockageQueryEditorView' (Name=''); target element is 'TextBlockComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable') TargetInvocationException:'System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'
を得る。しかし、私は現在、DataGridComboBoxColumn
をマッピングすることはできませんよ(:)私のために)
public Dictionary<string, ObservableCollection<string>> WhereFieldConditions
{
get
{
if (_whereFieldconditions == null)
{
_whereFieldconditions = new Dictionary<string, ObservableCollection<string>>();
_whereFieldconditions.Add("int", new ObservableCollection<string>(new string[] { "<", ">", "=", "!=" }.ToList<string>()));
_whereFieldconditions.Add("decimal", new ObservableCollection<string>(new string[] { "<", ">", "=", "!=" }.ToList<string>()));
_whereFieldconditions.Add("nvarchar", new ObservableCollection<string>(new string[] { "=", "like" }.ToList<string>()));
_whereFieldconditions.Add("varchar", new ObservableCollection<string>(new string[] { "=", "like" }.ToList<string>()));
_whereFieldconditions.Add("char", new ObservableCollection<string>(new string[] { "=", "like" }.ToList<string>()));
_whereFieldconditions.Add("datetime", new ObservableCollection<string>(new string[] { "<", ">", "=" }.ToList<string>()));
}
return _whereFieldconditions;
}
}
あいにくのViewModelでこのプロパティを作成しましたListViewアイテムに含まれているオブジェクトのDataTypeを使用します。私はそれが働いていないし、正直どちらにするために、このバインディングを変更する方法がわからない、それは行くための正しい方法だ場合:
Binding Path=DataContext.WhereFieldConditions[DataType], RelativeSource={RelativeSource AncestorType={x:Type Window}
感謝を。私はそれを試して、数時間であなたに戻ってきます。もう一度ありがとうございます – gipinani
私はあなたの解決策をとどめていますが、とにかく誤解を避けるための説明だけです。 [DataType]はバインドされたクラスの文字列プロパティですが、オブジェクト型を推測しようとしていません。 – gipinani
違いない私は恐れている:) – mm8