Привязка WPF ListView GridView: динамические столбцы - PullRequest
0 голосов
/ 25 марта 2011

Я привязываю DataGrid к DataSet на моей ViewModel.

Я хотел бы переключиться на более легкий элемент управления, такой как ListView.GridView, но он не поддерживает динамическую генерацию столбцов.

Поскольку это модель MVVM, я стараюсь избегать циклического перебора столбцов моего набора данных и добавлять каждый GridViewColumn из кода.

возможно ли: 1. явно привязать объявление Listview к столбцу настроек DataSet без параметров, или 2. связать коллекцию Columns со свойством в модели представления.

Если нет, то какие еще бесплатные элементы управления сеткой позволили бы это и превзошли DataGrid?

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

Допустим DataSet1:

Customer
  Name
  Address
  Phone

Модель:

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: (в сочетании с 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>
0 голосов
/ 25 марта 2011

Не думаю, что вы можете сделать это легко, я бы лично использовал интерфейс 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

 <conv:DataSetConverter x:key="datasetConverter"/>
                <ListBox x:Name="listbox1" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                        ItemsSource="{Binding datasetObject, Converter={StaticResource datasetConverter}}" >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...