2017-07-12 10 views
0

私はこれを持っています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> 

。現在のグラフィカルな結果以下

、ちょうどより具体的なアイデアを持っている

enter image description here

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} 

答えて

1

は、しかし、私は現在、データ型を使用してDataGridComboBoxColumnをマッピングすることはできませんよリストビューアイテムに含まれるオブジェクトの名前

これはXAMLでは実行できません。 XAMLはマークアップ言語であり、[DataType]を使用してListViewItemsSourceの基になるオブジェクトの型を解決することはできません。これはサポートされていません。

あなたはDictionary<string, ObservableCollection<string>>とデータオブジェクトを取り、オブジェクトの種類に基づいて、正しいObservableCollection<string>を返しmulti value converter使用できます。それは素晴らしいサウンドMM8 @

<Style TargetType="{x:Type ComboBox}"> 
    <Setter Property="ItemsSource"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource conv}"> 
       <Binding Path="DataContext.WhereFieldConditions" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
       <Binding Path="DataContext" RelativeSource="{RelativeSource AncestorType=ListViewItem}" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 
+1

感謝を。私はそれを試して、数時間であなたに戻ってきます。もう一度ありがとうございます – gipinani

+0

私はあなたの解決策をとどめていますが、とにかく誤解を避けるための説明だけです。 [DataType]はバインドされたクラスの文字列プロパティですが、オブジェクト型を推測しようとしていません。 – gipinani

+1

違いない私は恐れている:) – mm8

関連する問題