2011-03-24 7 views
0

내 ViewModel의 DataSet에 DataGrid를 바인딩하고 있습니다.WPF Listview GridView 바인딩 : 동적 열

ListView.GridView와 같은 더 가벼운 컨트롤로 전환하고 싶지만 동적 열 생성을 지원하지 않는 것으로 보입니다.

MVVM 모델이므로 데이터 세트 열을 반복하지 않고 코드 숨김의 각 GridViewColumn을 추가하지 않아도됩니다.

1. Listview를 명시 적으로 열을 설정하는 DataSet에 바인딩하거나 2. Columns 컬렉션을 ViewModel의 속성에 바인딩합니다.

그렇지 않은 경우,이를 허용하고 DataGrid를 능가하는 다른 무료 그리드 컨트롤은 무엇입니까?

+0

때문에 데이터 집합은 강력한 형식되지 않는 이유는 무엇입니까? 그래서 그것은 역동적입니까? –

+0

이 맞습니다. 강력하게 타입이 지정되지 않은 –

답변

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를하지 않는지 아십니까? –

+0

Gridview는 그것을 수행합니다. AutoGenerateColumns = true로 설정하면됩니다. –

+0

예. DataGrid가 열을 생성하는 데는 동일한 속성이 필요합니다. GridView does not do –

-2

가정을 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); 
     } 
    } 
} 

뷰 모델 (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

그는 동적 컬럼 생성에 대해 질문하지만 고의로 컬럼 세트에 대해서는 묻지 않습니다. 방금 일반적인 사용 사례를 설명했습니다. 다음에 질문을주의 깊게 읽으십시오. –