简体   繁体   English

WPF将listview绑定到字典 <string, Dictionary<string, bool> &gt;

[英]WPF binding listview to Dictionary<string, Dictionary<string, bool>>

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. 我有一个问题,我必须从数据库中获取List<string> ,在其上创建Dictionary<Dictionary<string, bool>>并用它填充listview

Here is my code: 这是我的代码:

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

不幸的是,它看起来像这样

Have you know any way, how to fix this, or do smth new? 您是否知道任何方法,如何解决此问题,或者做些新的事情?

Thanks a lot to StepUp and Ilan for helping. 非常感谢StepUp和Ilan的帮助。 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();
        }
    }
}

Your DataTemplate looks good. 您的DataTemplate看起来不错。 Try to write: 尝试写:

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

The work example looks like the following code snippet: 该工作示例看起来像以下代码片段:

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

Update: 更新:

To get a value from Dictionary , you should use the following syntax: 要从Dictionary获取值,您应该使用以下语法:

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

So your code should look like this: 因此,您的代码应如下所示:

factory.SetBinding(ToggleButton.IsCheckedProperty, new Binding(dictionary[1]));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM