2016-05-10 18 views
0

問題があります。データベースからList<string>を取得し、Dictionary<Dictionary<string, bool>>を作成してlistviewと入力してください。ここでWPFバインディングリストから辞書<string、dictionary <string、bool >>

は私のコードです:

XAML:

<ListView x:Name="PlanningDataGrid" 
       Grid.Row="0" 
       Width="{Binding Path=ActualWidth, ElementName=grid}" 
       ItemsSource="{Binding EventTypesCombinerCollection}" 
       VerticalAlignment="Stretch" 
       HorizontalContentAlignment="Stretch" 
       VerticalContentAlignment="Stretch"> 
    </ListView> 

モデル:

public class MainViewModel_Combiner : BindableBase // модель по событиям работы скважины 
{ 
    private Dictionary<string, Dictionary<string, bool>> _eventTypesCombinerCollection; 

    /// <summary> 
    /// Именованный двумерный массив совмещения мероприятий. Совмещение определяется как EventTypesCombinerCollection["type1"]["type2"] 
    /// </summary> 
    public Dictionary<string, Dictionary<string, bool>> EventTypesCombinerCollection 
    { 
     get { return _eventTypesCombinerCollection; } 
     set 
     { 
      _eventTypesCombinerCollection = value; 
      OnPropertyChanged("EventTypesCombinerCollection"); 
     } 
    } 
    public MainViewModel_Combiner() 
    { 
     EventTypesCombinerCollection = new Dictionary<string, Dictionary<string, bool>>(); 
     GenerateEventTypesCocllectionFrameFromDataBase(); 
    } 

    /// <summary> 
    /// Заполняет двумерный словать типов мероприятий (абстракция для получения квадратной таблицы с одинаковыми заголовками строк и столбцов) 
    /// </summary> 
    private void GenerateEventTypesCocllectionFrameFromDataBase() 
    { 
     var EventTypesList = GetEventTypesList(); 
     foreach (string eventTypeCombiner in EventTypesList) 
     { 
      Dictionary<string, bool> combiningItems = new Dictionary<string, bool>(); 
      foreach (string eventTypeCombining in EventTypesList) 
      { 
       combiningItems.Add(eventTypeCombining, false); 
      } 
      EventTypesCombinerCollection.Add(eventTypeCombiner, combiningItems); 
     } 
    } 

    /// <summary> 
    /// Собирает список типов мероприятий из БД 
    /// </summary> 
    /// <returns></returns> 
    private List<string> GetEventTypesList() 
    { 
     using (var db = new IP_dbEntities()) 
     { 
      return db.EVENTS_TYPE.Select(e => e.event_type.Trim()).ToList(); 
     } 
    } 
} 

とxaml.csファイル:

public partial class Combiner : Window 
{ 
    public Combiner() 
    { 
     InitializeComponent(); 
     CreateDataGridColumns(); 
    } 

    private void CreateDataGridColumns() 
    { 
     var gridView = new GridView(); 
     PlanningDataGrid.View = gridView; 
     gridView.Columns.Add(new GridViewColumn() { Header = "Тип мероприятия", DisplayMemberBinding = new Binding("Key") }); // Создаем первый столбец 
     var eventTypeList = GetEventTypesList(); 
     foreach (string eventType in eventTypeList) 
     { 
      var listViewColumn = new GridViewColumn 
      { 
       Header = eventType, 
       DisplayMemberBinding = new Binding("Value[" + eventType + "]"), 
       Width = 30, 
       CellTemplate = GenerateCellTemplate(eventType), 
      }; 
      gridView.Columns.Add(listViewColumn); 
     } 
    } 

    private DataTemplate GenerateCellTemplate(string eventType) 
    { 
     var template = new DataTemplate(); 
     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CheckBox)); 
     factory.SetBinding(ToggleButton.IsCheckedProperty, new Binding("Value[" + eventType + "]")); 
     template.VisualTree = factory; 
     return template; 
    } 

    /// <summary> 
    /// Собирает список типов мероприятий из БД 
    /// </summary> 
    /// <returns></returns> 
    private List<string> GetEventTypesList() 
    { 
     using (var db = new IP_dbEntities()) 
     { 
      return db.EVENTS_TYPE.Select(e => e.event_type.Trim()).ToList(); 
     } 
    } 
} 

unfortunatelly it looks like this

これはどのように修正するのですか、それとも新しいことを知っていますか?

+0

修正 - –

+0

[OK]を、私はこれをチェックしてみましょうチェックボックスではなく、「偽」を作ります。 – Ilan

+0

ありがとう、この件で多くの問題がありました –

答えて

1

助けてくれたStepUpとIlanに感謝します。私はこの行を削除する必要があるコードが背後にある:

DisplayMemberBinding = new Binding("Value[" + eventType + "]"), 

ので、解決策があります:

public partial class Combiner : Window 
{ 
    public Combiner() 
    { 
     InitializeComponent(); 
     CreateDataGridColumns(); 
    } 

    private void CreateDataGridColumns() 
    { 
     var gridView = new GridView(); 
     PlanningDataGrid.View = gridView; 
     gridView.Columns.Add(new GridViewColumn() { Header = "Тип мероприятия", DisplayMemberBinding = new Binding("Key") }); // Создаем первый столбец 
     var eventTypeList = GetEventTypesList(); 
     foreach (string eventType in eventTypeList) 
     { 
      Binding binding = new Binding(); 
      var listViewColumn = new GridViewColumn 
      { 
       Header = eventType, 
       Width = 30, 
       CellTemplate = GenerateCellTemplate(eventType), 
      }; 
      gridView.Columns.Add(listViewColumn); 
     } 
    } 

    private DataTemplate GenerateCellTemplate(string eventType) 
    { 
     FrameworkElementFactory checkbox = new FrameworkElementFactory(typeof(CheckBox)); 
     checkbox.SetBinding(ToggleButton.IsCheckedProperty, new Binding("Value[" + eventType + "]") {Mode = BindingMode.TwoWay}); 
     return new DataTemplate() {VisualTree = checkbox}; 
    } 

    /// <summary> 
    /// Собирает список типов мероприятий из БД 
    /// </summary> 
    /// <returns></returns> 
    private List<string> GetEventTypesList() 
    { 
     using (var db = new IP_dbEntities()) 
     { 
      return db.EVENTS_TYPE.Select(e => e.event_type.Trim()).ToList(); 
     } 
    } 
} 
0

DataTemplateがうまく見えます。作業の例は、次のコードスニペットのように見えます

factory.SetBinding(ToggleButton.IsCheckedProperty, new Binding(eventType)); 

FrameworkElementFactory checkbox = new FrameworkElementFactory(typeof(CheckBox)); 
checkbox.Name = "aCheckBox"; 
checkbox.SetBinding(ToggleButton.IsCheckedProperty, new Binding("YourBoolProperty")); 
DataTemplate dataTemplate = new DataTemplate() { VisualTree = checkbox }; 

アップデート:書き込もう

Dictionaryから値を取得するには、次の構文を使用する必要があります。

Dictionary<int, string> dictionary = new Dictionary<int, string>(); 
string str = dictionary[1]; 

あなたのコード

+0

@ДмитрийРепинfeel自由に質問してください。 – StepUp

+0

私は書くことができません:factory.SetBinding(ToggleButton.IsCheckedProperty、new Binding(eventType));それは辞書であり、eventTypeがキーです –

+0

@ДмитрийРепин私の更新されたセクションを参照してください – StepUp

関連する問題