简体   繁体   English

WPF Listview GridView绑定:动态列

[英]WPF Listview GridView Binding: Dynamic Columns

I am binding a DataGrid to a DataSet on my ViewModel. 我将DataGrid绑定到ViewModel上的DataSet上。

I would like to switch to a more light weight control such as ListView.GridView, but it doesn't appear it supports dynamic column generation. 我想切换到更轻量的控件,如ListView.GridView,但它似乎不支持动态列生成。

Since this is a MVVM model, i am trying to avoid having to loop through my dataset columns, and add each GridViewColumn from a codebehind. 由于这是MVVM模型,因此我试图避免遍历数据集列,并从背后的代码中添加每个GridViewColumn。

is it possible to 1. Bind ad a Listview to a DataSet w/out setting columns explicitly, or 2. Bind the Columns collection to a property on the ViewModel. 是否可以1.将Listview广告明确绑定到不带设置列的DataSet上,或2.将Columns集合绑定到ViewModel的属性上。

If not, what are some other free grid controls that would allow this and outperform DataGrid? 如果不是,还有哪些其他免费网格控件可以实现此功能并胜过DataGrid?

Dont believe you can do it easily, i would personally use the IValueConverter interface to convert your DataSet to an object that you can manage your columns inside. 不相信您可以轻松做到这一点,我个人将使用IValueConverter接口将DataSet转换为可以在其中管理列的对象。

public sealed class DataSetConverter : IValueConverter
    {

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
           if((DataSet)value != null)
{

// Put logic in here to loop through the columns and create an object to bind to the ListView control.

}
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }

XAML Code XAML代码

 <conv:DataSetConverter x:key="datasetConverter"/>
                <ListBox x:Name="listbox1" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                        ItemsSource="{Binding datasetObject, Converter={StaticResource datasetConverter}}" >

Assume DataSet1: 假设数据集1:

Customer
  Name
  Address
  Phone

Model: 模型:

namespace WpfApplication1.Model
{
    class MyDataSetModel
    {
        private DataSet1 _myDataSet;
        private DataSet1TableAdapters.CustomerTableAdapter _myCustomerTableAdapter;
        public DataSet1.CustomerDataTable Customers
        {
            get { return _myDataSet.Customer; }   
        }

        public void FetchCustomers()
        {
            _myDataSet = new DataSet1();
            _myCustomerTableAdapter = new CustomerTableAdapter();
            _myCustomerTableAdapter.Fill(_myDataSet.Customer);
        }
    }
}

ViewModel: (combined with View here for clairity) ViewModel :(与此处的View结合使用)

public partial class Window1 : Window
{
    private MyDataSetModel _myDataModel;
    public Window1()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(Window1_Loaded);
    }

    void Window1_Loaded(object sender, RoutedEventArgs e)
    {
        _myDataModel = new MyDataSetModel();
        _myDataModel.FetchCustomers();

        listView1.ItemsSource = _myDataModel.Customers;
    }
}

View: 视图:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="400" Width="600">
    <Grid>
        <ListView Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding= "{Binding Path=Name}">
                        <GridViewColumnHeader Width="100">Name</GridViewColumnHeader>
                    </GridViewColumn>

                    <GridViewColumn DisplayMemberBinding= "{Binding Path=Address}">
                        <GridViewColumnHeader Width="340">Address</GridViewColumnHeader>
                    </GridViewColumn>

                    <GridViewColumn DisplayMemberBinding= "{Binding Path=Phone}">
                        <GridViewColumnHeader Width="100">Phone</GridViewColumnHeader>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

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

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