문제

실행 시간에 WPF ListView에서 그리드 열 (또는 다른 디스플레이 레이아웃)을 동적으로 빌드하고 싶습니다. 나는 열의 번호와 이름을 손에 알지 못합니다.

나는 할 수 있기를 원한다 :
myListView.ItemSource = myDataset;
myListView.createColumns ();

도움이 되었습니까?

해결책

다음 접근 방식을 시도해 볼 것입니다.

a) 목록 상자 표시 그리드보기가 있어야합니다.
b) GridViewColumnHeader의 스타일 정의 :

        <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="gridViewColumnStyle">
            <EventSetter Event="Click" Handler="OnHeaderClicked"/>
            <EventSetter Event="Loaded" Handler="OnHeaderLoaded"/>
        </Style>

제 경우에는 다른 속성이 여러 가지 세트가 있었지만 기본 시나리오에는로드 된 이벤트가 필요합니다. 클릭 - 정렬 및 필터링 기능을 추가하려는 경우 유용합니다.

c) ListView 코드에서 템플릿을 GridView와 바인딩하십시오.

    public MyListView()
    {
        InitializeComponent();
        GridView gridViewHeader = this.listView.View as GridView;
        System.Diagnostics.Debug.Assert(gridViewHeader != null, "Expected ListView.View should be GridView");
        if (null != gridViewHeader)
        {
            gridViewHeader.ColumnHeaderContainerStyle = (Style)this.FindResource("gridViewColumnStyle");
        }
    }

d) 그런 다음 내용으로 내부로드 된 처리기에서 열 데이터를 기반으로 적절한 템플릿을 설정할 수 있습니다.

    void OnHeaderLoaded(object sender, RoutedEventArgs e)
    {
        GridViewColumnHeader header = (GridViewColumnHeader)sender;
        GridViewColumn column = header.Column;

// 여기에서 데이터 템플릿을 선택하고 적용하십시오.

        e.Handled = true;
    }

e) 항목 소스 의존성 속성의 소유권을 획득하고 변경된 이벤트를 처리해야한다고 생각합니다.

            ListView.ItemsSourceProperty.AddOwner(typeof(MyListView), new PropertyMetadata(OnItemsSourceChanged));

        static void OnItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            MyListView view = (MyListView)sender;
            //do reflection to get column names and types
            //and for each column, add it to your grid view:
            GridViewColumn column = new GridViewColumn();
            //set column properties here...
            view.Columns.Add(column);
        }

GridViewColumn 클래스 자체에는 속성이 많지 않으므로 첨부 된 속성을 사용하여 일부 정보를 추가 할 수 있습니다. 즉, 고유 한 열 태그와 같은 헤더는 현지화에 사용될 가능성이 높으며,이를 통해 전달되지 않습니다.

일반적 으로이 접근법은 매우 복잡하지만 목록보기 기능을 쉽게 확장 할 수 있습니다.

다른 팁

첨부 된 속성을 사용하여 열을 ListView에 동적으로 추가 할 수 있습니다. 이 기사를 확인하십시오 CodeProject 정확히 설명합니다 ...

WPF DynamicListView- Datamatrix에 바인딩

MSDN에서 :

    MyListBox.ItemsSource = view;
    ListView myListView = new ListView();

    GridView myGridView = new GridView();
    myGridView.AllowsColumnReorder = true;
    myGridView.ColumnHeaderToolTip = "Employee Information";

    GridViewColumn gvc1 = new GridViewColumn();
    gvc1.DisplayMemberBinding = new Binding("FirstName");
    gvc1.Header = "FirstName";
    gvc1.Width = 100;
    myGridView.Columns.Add(gvc1);
    GridViewColumn gvc2 = new GridViewColumn();
    gvc2.DisplayMemberBinding = new Binding("LastName");
    gvc2.Header = "Last Name";
    gvc2.Width = 100;
    myGridView.Columns.Add(gvc2);
    GridViewColumn gvc3 = new GridViewColumn();
    gvc3.DisplayMemberBinding = new Binding("EmployeeNumber");
    gvc3.Header = "Employee No.";
    gvc3.Width = 100;
    myGridView.Columns.Add(gvc3);

    //ItemsSource is ObservableCollection of EmployeeInfo objects
    myListView.ItemsSource = new myEmployees();
    myListView.View = myGridView;
    myStackPanel.Children.Add(myListView);

가지고있다 DataTemplatesExector 사전 정의 된 템플릿 중 하나 (동일한 데이터 유형)를 선택하고 선택기를 ListView에 적용하십시오. 열이 다른 많은 데이터 emplate를 가질 수 있습니다.

당신은 a를 사용할 수 있습니다 DataTemplatesExector 코드에서 동적으로 생성 한 데이터 emplate을 반환합니다. 그러나 이것은 XAML에서 사전 정의 된 것을 사용하는 것보다 약간 지루하고 복잡하지만 여전히 가능합니다. 이 예를 살펴보십시오. http://dedjo.blogspot.com/2007/03/creating-datatemplates-from-code.html

경험을 통해 도와 드릴 수있는 경우 동적 데이터 템플릿을 제거하는 것이 좋습니다. 오히려 여기에 제공된 조언을 사용하여 DataTemplate을 동적으로 만들지 않고 ListView 열을 명시 적으로 만듭니다.

이유는 FrameworkElementFactory (또는 클래스 이름이 런타임에 데이터 emplates를 생성하는 것)가 사용하기가 다소 Cludgey (동적 템플릿에 XAML을 사용하는 것을 선호하는)이기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top