2011-03-24 64 views
0

我将DataGrid绑定到ViewModel上的DataSet。WPF列表视图GridView绑定:动态列

我想切换到更轻质控制诸如ListView.GridView,但它不会出现它支持动态列生成。

由于这是一个MVVM模式,我试图避免通过我的数据集列有循环,并从代码隐藏添加每个GridViewColumn。

是有可能1绑定广告一个ListView到DataSet瓦特/输出设置列的明确,或2绑定列集合对视图模型的属性。

如果不是,那么有什么其他的免费网格控件可以实现这一点并且胜过DataGrid?

+0

所以数据集不是强类型?所以它是动态的? – 2011-03-24 23:55:30

+0

这是正确的。不是强类型 – 2011-03-24 23:56:50

回答

0

不相信你可以很容易地做到这一点,我个人使用的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}}" > 
+0

你知道为什么DataGrid透明但不是Gridview吗? – 2011-03-25 14:11:25

+0

Gridview确实做到了,只要确保你打开AutoGenerateColumns = true – 2011-03-26 23:15:36

+0

是的,我试过了。 DataGrid需要使用相同的属性才能生成列。 GridView不这样做 – 2011-04-06 12:05:14

-2

假设数据集1:

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); 
     } 
    } 
} 

视图模型:(联合查看这里clairity)

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; 
    } 
} 

查看:

<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

他询问动态列的生成,但不是关于明确的列集。你刚才描述了一个常见的用例。下次请仔细阅读这个问题。 – 2012-08-29 23:21:46