WPF绑定列表到Dictionary< string,Dictionary< string,bool>> [英] WPF binding listview to Dictionary<string, Dictionary<string, bool>>

查看:104
本文介绍了WPF绑定列表到Dictionary< string,Dictionary< string,bool>>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,我必须从数据库中获取列表< string> ,创建字典<字典< string,bool>> ; ,并填写 listview



这是我的代码:



xaml:

 < ListView x:Name =PlanningDataGrid
Grid.Row =0
宽度={Binding Path = ActualWidth,ElementName = grid}
ItemsSource ={Binding EventTypesCombinerCollection}
VerticalAlignment =Stretch
Horizo​​ntalContentAlignment =Stretch
VerticalContentAlignment =Stretch>
< / ListView>

型号:

 code> public class MainViewModel_Combiner:BindableBase //модельпособытиямработыскважины
{
私人字典<字符串,字典< 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(EventTypesList中的字符串eventTypeCombiner)
{
字典< string,bool> combineItems = new Dictionary< string,bool>();
foreach(String EventTypeCombining in EventTypesList)
{
combiningItems.Add(eventTypeCombining,false);
}
EventTypesCombinerCollection.Add(eventTypeCombiner,combineItems);
}
}

///< summary>
///СобираетсписоктиповмероприятийизБД
///< / summary>
///< returns>< / returns>
私人列表< 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(eventTypeList中的string eventType)
{
var listViewColumn = new GridViewColumn
{
标题= eventType,
DisplayMemberBinding = new Binding(Value [ + eventType +]),
宽度= 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;
返回模板;
}

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



你知道吗,如何解决这个问题,还是做新的?

解决方案

非常感谢StepUp和Ilan的帮助。我只需要删除这行就是代码:

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

所以有一个解决方案:



公共部分类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(eventTypeList中的string eventType)
{
绑定绑定= new Binding();
var listViewColumn = new GridViewColumn
{
标题= eventType,
宽度= 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});
返回新的DataTemplate(){VisualTree = checkbox};
}

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


I've got a problem, I have to take List<string> from database, create Dictionary<Dictionary<string, bool>> on it and fill listview with it.

Here is my code:

xaml:

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

model:

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();
        }
    }
}

and xaml.cs file:

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();
        }
    }
}

Have you know any way, how to fix this, or do smth new?

解决方案

Thanks a lot to StepUp and Ilan for helping. I just need to delete this row is code behind:

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

so, there is a solution:

    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();
        }
    }
}

这篇关于WPF绑定列表到Dictionary&lt; string,Dictionary&lt; string,bool&gt;&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆