动态生成列MVVM [英] Dynamic generate column mvvm

查看:149
本文介绍了动态生成列MVVM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尽量让动态生成列的一个ListView。我使用MVVM百通。
我怎么能实现呢?
在这个momemt我只有静态列。

 < ListView控件的ItemsSource ={结合ProblemProducts}
                  Grid.Row =1Grid.RowSpan =4的Horizo​​ntalAlignment =左VerticalAlignment =顶部Grid.Column =4>
            < ListView.View>
                <&GridView的GT;
                    < GridViewColumn标题=SpisującyDisplayMemberBinding ={结合_spisujacy}WIDTH =自动/>
                    < GridViewColumn标题=MiejsceskładowaniaDisplayMemberBinding ={结合MiejsceSkladowania}WIDTH =自动/>
                    < GridViewColumn标题=典型spisuDisplayMemberBinding ={结合_typSpisu}WIDTH =自动/>
                    < GridViewColumn标题=KODDisplayMemberBinding ={结合KOD}WIDTH =自动/>
                < / GridView的>
            < /ListView.View>
        < /&的ListView GT;


解决方案

您可以创建 GridView控件适当的动态列使用转换器。在这里工作的例子:

MainWindow.xaml

 <窗​​口x:类=WpfApplication1.MainWindow
        的xmlns =htt​​p://schemas.microsoft.com/winfx/2006/xaml/$p$psentation
        的xmlns:X =htt​​p://schemas.microsoft.com/winfx/2006/xaml
        的xmlns:WpfApplication1 =CLR的命名空间:WpfApplication1
        MC:可忽略=D的xmlns:D =htt​​p://schemas.microsoft.com/ex$p$pssion/blend/2008
        的xmlns:MC =htt​​p://schemas.openxmlformats.org/markup-compatibility/2006
        D:DesignHeight =189D:DesignWidth =312WIDTH =300HEIGHT =300>
    < Window.Resources>
        < WpfApplication1:ConfigToDynamicGridViewConverter X:键=ConfigToDynamicGridViewConverter/>
    < /Window.Resources>
    < ListView控件的ItemsSource ={结合产品}中查看={结合ColumnConfig,转换器= {StaticResource的ConfigToDynamicGridViewConverter}}/>
< /窗GT;

MainWindow.xaml.cs

 使用System.Collections.Generic;
使用System.Windows;命名空间WpfApplication1
{
    ///<总结>
    ///为MainWindow.xaml交互逻辑
    ///< /总结>
    公共部分类主窗口:窗口
    {
        公共主窗口()
        {
            的InitializeComponent();
            的DataContext =新视图模型();
        }
    }    公共类视图模型
    {
        公共ColumnConfig ColumnConfig {搞定;组; }
        公共IEnumerable的<产品与GT;产品{搞定;组; }        公共视图模型()
        {
            产品=新的List<产品与GT; {新产品{名称=一些产品,属性=非常酷的产品},新产品{名称=其他产品,属性=不是很爽一}};
            ColumnConfig =新ColumnConfig {列=新的List<列> {新列{标题=名称,数据字段=姓名},新列{标题=属性,数据字段=属性}}};
        }
    }    公共类ColumnConfig
    {
        公共IEnumerable的<列>列{搞定;组; }
    }    公共类列
    {
        公共字符串头{搞定;组; }
        公共字符串数据字段{搞定;组; }
    }    公共类产品
    {
        公共字符串名称{;组; }
        公共字符串属性{获得;组; }
    }
}

ConfigToDynamicGridViewConverter.cs

 使用系统;
使用System.Globalization;
使用System.Windows.Controls的;
使用System.Windows.Data;命名空间WpfApplication1
{
    公共类ConfigToDynamicGridViewConverter:的IValueConverter
    {
        公共对象转换(对象的值,类型TARGETTYPE,对象参数,CultureInfo的文化)
        {
            无功配置=值ColumnConfig;
            如果(配置!= NULL)
            {
                VAR grdiView =新的GridView();
                的foreach(在config.Columns VAR列)
                {
                    VAR约束力=新绑定(column.DataField);
                    grdiView.Columns.Add(新GridViewColumn {头= column.Header,DisplayMemberBinding =结合});
                }
                返回grdiView;
            }
            返回Binding.DoNothing;
        }        公共对象ConvertBack(对象的值,类型TARGETTYPE,对象参数,CultureInfo的文化)
        {
            抛出新NotSupportedException异常();
        }
    }
}

I try to make a ListView with dynamic generation of column. I use mvvm patern. How i can implement this? In this momemt I have only static columns.

<ListView ItemsSource="{Binding ProblemProducts}"
                  Grid.Row="1" Grid.RowSpan="4" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="4">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Spisujący" DisplayMemberBinding="{Binding _spisujacy}" Width="auto"/>
                    <GridViewColumn Header="Miejsce składowania" DisplayMemberBinding="{Binding MiejsceSkladowania}" Width="auto"/>
                    <GridViewColumn Header="Typ spisu" DisplayMemberBinding="{Binding _typSpisu}" Width="auto"/>
                    <GridViewColumn Header="Kod" DisplayMemberBinding="{Binding Kod}" width="auto"/>
                </GridView>
            </ListView.View>
        </ListView>

解决方案

You can create GridView with appropriate columns dynamically using converter. Here is working example:

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:WpfApplication1="clr-namespace:WpfApplication1" 
        mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        d:DesignHeight="189" d:DesignWidth="312" Width="300" Height="300">
    <Window.Resources>
        <WpfApplication1:ConfigToDynamicGridViewConverter x:Key="ConfigToDynamicGridViewConverter" />
    </Window.Resources>
    <ListView ItemsSource="{Binding Products}" View="{Binding ColumnConfig, Converter={StaticResource ConfigToDynamicGridViewConverter}}"/>    
</Window>

MainWindow.xaml.cs

using System.Collections.Generic;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new ViewModel();
        }
    }

    public class ViewModel
    {
        public ColumnConfig ColumnConfig { get; set; }
        public IEnumerable<Product> Products { get; set; }

        public ViewModel()
        {
            Products = new List<Product> { new Product { Name = "Some product", Attributes = "Very cool product" }, new Product { Name = "Other product", Attributes = "Not so cool one" } };
            ColumnConfig = new ColumnConfig { Columns = new List<Column> { new Column { Header = "Name", DataField = "Name" }, new Column { Header = "Attributes", DataField = "Attributes" } } };
        }
    }

    public class ColumnConfig
    {
        public IEnumerable<Column> Columns { get; set; }
    }

    public class Column
    {
        public string Header { get; set; }
        public string DataField { get; set; }
    }

    public class Product
    {
        public string Name { get; set; }
        public string Attributes { get; set; }
    }
}

ConfigToDynamicGridViewConverter.cs

using System;
using System.Globalization;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApplication1
{
    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)
                {
                    var binding = new Binding(column.DataField);
                    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();
        }
    }
}

这篇关于动态生成列MVVM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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