Флажок привязки 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; }
        }
}

Ну вот и все, я надеюсь, ты сможешь мне помочь,

Спасибо за ваше время

0 ответов

Другие вопросы по тегам