[英]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.