Флажок привязки DataTemplate
моя проблема:
Мне нужно настроить databinind моего checkboxex по коду, но эти Checkbox-ы включены в DataTemplate для применения к списку с динамическими столбцами, у меня все получилось, но мне не нравится то, как я это делал, потому что он ломается с моя концепция динамических столбцов в моем Listview, теперь я создаю DataTemplate для каждого возможного столбца в моем Listview, все динамические столбцы будут CheckBoxes, поэтому я предполагаю, как я могу создать только один DataTempleate, а не так много, как я сделал сейчас
мой код:
У меня есть такой класс:
public class CArea
{
public int Id { get; set; }
public string Name { get; set; }
public bool[] items { get; set; }
public CArea()
{
items = new bool[3]; //this is the dynamic,every field will be a column
items[0] = true;
items[1] = true;
items[2] = false;
}
}
Мне нужно связать области ObservableCollection в ListView с динамическими столбцами, в этом примере 3 элемента, но может быть 4,2,5 или что-то еще, проблема динамической генерации столбцов - это нормально с конвертером (благодаря динамической генерации столбцов mvvm), моя проблема - привязка CheckBox для каждого элемента в коллекции Areas, теперь я пишу xaml, как это
<Window.Resources>
<!--<datagridDinamico:ConfigToDynamicGridViewConverter x:Key="ConfigToDynamicGridViewConverter" />-->
<local:ConfigToDynamicGridViewConverter x:Key="ConfigToDynamicGridViewConverter" />
<DataTemplate x:Key="Chk0" DataType="{x:Type GridViewColumn}">
<CheckBox IsChecked="{Binding items[0]}" />
</DataTemplate>
<DataTemplate x:Key="Chk1" DataType="{x:Type GridViewColumn}">
<CheckBox IsChecked="{Binding items[1]}" />
</DataTemplate>
<DataTemplate x:Key="Chk2" DataType="{x:Type GridViewColumn}">
<CheckBox IsChecked="{Binding items[2]}" />
</DataTemplate>
</Window.Resources>
<ListView ItemsSource="{Binding Areas}" View="{Binding ColumnConfig, Converter={StaticResource ConfigToDynamicGridViewConverter}}"/>
Один шаблон для каждого items[i]
но это ужасно и разрушает динамическую концепцию моего списка. Код конвертера такой:
public class ConfigToDynamicGridViewConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var config = value as ColumnConfig;
if (config != null)
{
var grdiView = new GridView();
foreach (var column in config.Columns)
{
bool usaTemplate = !string.IsNullOrEmpty(column.ContentControlDataTemplate);
var binding = new Binding(usaTemplate ? column.ContentControlDataTemplate : column.TextDataField);
if (usaTemplate)
{
Window window = Application.Current.MainWindow;
DataTemplate template = (DataTemplate)window.FindResource(column.ContentControlDataTemplate);
grdiView.Columns.Add(new GridViewColumn { Header = column.Header, CellTemplate = template });
}
else
grdiView.Columns.Add(new GridViewColumn { Header = column.Header, DisplayMemberBinding = binding });
}
return grdiView;
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
Как вы можете видеть, я взял DataTemplate из объекта конфигурации столбца,... и это не совсем хорошо, потому что мне нужно установить его вручную в viewmodel, как это
public class ViewModel
{
public ColumnConfig ColumnConfig { get; set; }
public ObservableCollection<CArea> Areas { get; set; }
public ViewModel()
{
Areas = new ObservableCollection<CArea>() {
new CArea {Id=1, Name = "Area 1" },
new CArea(){Id=2,Name="Area2" } };
ColumnConfig = new ColumnConfig
{
Columns = new List<Column>
{
new Column { Header = "Area", TextDataField = "Nombre" }
}
};
Categorias = ServCategory.GetAllPossibleColums();
int i = 0;
foreach (var c in Categorias)
{
ColumnConfig.Columns.Add(new Column() { Header = c.Nombre, ContentControlDataTemplate = "Chk"+i.ToString()});
i++;
}
}
private List<CCategoria> categorias;
public List<CCategoria> Categorias
{
get { return categorias; }
set { categorias = value; }
}
}
Ну вот и все, я надеюсь, ты сможешь мне помочь,
Спасибо за ваше время