2017-10-25 3 views
1

XAML 코드 :Column에 CellTemplates가있는 곳에서 프로그래밍 방식으로 GridView를 만드는 방법은 무엇입니까?

<ListView x:Name="ListDisplay" 
      Grid.Column="1"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn x:Name="Column_1" 
          x:FieldModifier="private" 
          Header="Column1" 
          Width="200"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <DockPanel> 
          <Image Width="15" 
            Height="15" 
            Source="{Binding Icon}" 
            DockPanel.Dock="Left"/> 
          <Label Content="{Binding Column1_Content}" 
            Width="180" 
            FontSize="12" 
            HorizontalContentAlignment="Left" 
            DockPanel.Dock="Left"/> 
         </DockPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn x:Name="Column_2" x:FieldModifier="private" 
          Header="Column2" 
          DisplayMemberBinding="{Binding Column2_Content}" 
          Width="175"/> 
      <GridViewColumn x:Name="Column_3" 
          x:FieldModifier="private" 
          Header="Column3" 
          DisplayMemberBinding="{Binding Column3_Content}" 
          Width="100"/> 
      <GridViewColumn x:Name="Column_4" x:FieldModifier="private" 
          Header="Column4" 
          DisplayMemberBinding="{Binding Column4_Content}" 
          Width="100"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

C# 클래스 :

internal class MyDataClass 
{ 
    public BitmapSource Icon { get; set; } 
    public string Column1_Content { get; set; } 
    public string Column2_Content { get; set; } 
    public string Column3_Content { get; set; } 
    public string Column4_Content { get; set; } 
} 

이 4 열이있는 ListView에 기본적이며, 첫 번째 열은 왼쪽의 이미지를 가지고있다. 모든 것이 지금까지 작동합니다.

는 내가 뭘 원하는 C# 코드로 전체에게 코드의

<ListView.View> 
... 
</ListView.View> 

부분을 변환합니다.

그래서 코드는 다음과 같이 표시됩니다

GridView View = new GridView(); 

GridViewColumn Column_2 = new GridViewColumn() 
{ 
    Header = "Column2", 
    DisplayMemberBinding = new Binding("Column2_Content"), 
    Width = 175 
}; 

// Same thing for columns 3 and 4 

View.Columns.Add(Column_2); 
View.Columns.Add(Column_3); 
View.Columns.Add(Column_4); 
ListDisplay.View = View; 

문제는, 나는 아이콘 소스 및 레이블 내용에 바인딩을하고 C#에서 (프로그래밍 열 1의 GridViewColumn을 만드는 방법을 전혀 생각이 없다).

답변

1

다음은 코드 숨김에서 원하는 ListView을 생성하기위한 전체 예제입니다.

XAML :

<StackPanel> 
    <ListView x:Name="MyListView" ItemsSource="{Binding Items}"></ListView> 
    <Button Content="Create View" Click="CreateViewButtonClicked"></Button> 
</StackPanel> 

코드 숨김

이 처음에 빈 ListViewButton 포함
public partial class MainWindow : Window 
{ 
    private GridViewColumn Column_1; 
    private GridViewColumn Column_2; 
    private GridViewColumn Column_3; 
    private GridViewColumn Column_4; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = this; 

     InitializeColumn1(); 
     InitializeColumn2(); 
     InitializeColumn3(); 
     InitializeColumn4(); 

     SetItemsSource(); 
    } 

    private void SetItemsSource() 
    { 
     Items = new ObservableCollection<MyDataClass> 
     { 
      new MyDataClass 
      { 
       Icon = new BitmapImage(new Uri("https://www.gravatar.com/avatar/b6f0ad4cd865587a782bf697d3b18d18?s=32&d=identicon&r=PG&f=1")), 
       Column1_Content = "Column1 Content", 
       Column2_Content = "Column2 Content", 
       Column3_Content = "Column3 Content", 
       Column4_Content = "Column4 Content" 
      } 
     }; 
    } 

    private void InitializeColumn1() 
    { 
     var column1Template = new FrameworkElementFactory(typeof(DockPanel)); 
     var column1TemplateImage = new FrameworkElementFactory(typeof(Image)); 
     column1TemplateImage.SetValue(WidthProperty, 15d); 
     column1TemplateImage.SetValue(HeightProperty, 15d); 
     column1TemplateImage.SetBinding(Image.SourceProperty, new Binding("Icon")); 
     column1TemplateImage.SetValue(DockPanel.DockProperty, Dock.Left); 
     var column1TemplateLabel = new FrameworkElementFactory(typeof(Label)); 
     column1TemplateLabel.SetBinding(ContentProperty, new Binding("Column1_Content")); 
     column1TemplateLabel.SetValue(WidthProperty, 180d); 
     column1TemplateLabel.SetValue(FontSizeProperty, 12d); 
     column1TemplateLabel.SetValue(HorizontalContentAlignmentProperty, HorizontalAlignment.Left); 
     column1TemplateLabel.SetValue(DockPanel.DockProperty, Dock.Left); 

     column1Template.AppendChild(column1TemplateImage); 
     column1Template.AppendChild(column1TemplateLabel); 

     Column_1 = new GridViewColumn 
     { 
      Header = "Column1", 
      Width = 200, 
      CellTemplate = new DataTemplate { VisualTree = column1Template } 
     }; 
    } 

    private void InitializeColumn2() 
    { 
     Column_2 = new GridViewColumn 
     { 
      Header = "Column2", 
      Width = 175, 
      DisplayMemberBinding = new Binding("Column2_Content") 
     }; 
    } 

    private void InitializeColumn3() 
    { 
     Column_3 = new GridViewColumn 
     { 
      Header = "Column3", 
      Width = 100, 
      DisplayMemberBinding = new Binding("Column3_Content") 
     }; 
    } 

    private void InitializeColumn4() 
    { 
     Column_4 = new GridViewColumn 
     { 
      Header = "Column4", 
      Width = 100, 
      DisplayMemberBinding = new Binding("Column4_Content") 
     }; 
    } 

    private void CreateViewButtonClicked(object sender, RoutedEventArgs e) 
    { 
     var gridView = new GridView(); 

     gridView.Columns.Add(Column_1); 
     gridView.Columns.Add(Column_2); 
     gridView.Columns.Add(Column_3); 
     gridView.Columns.Add(Column_4); 

     MyListView.View = gridView; 
    } 

    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
     "Items", typeof(ObservableCollection<MyDataClass>), typeof(MainWindow), new PropertyMetadata(default(ObservableCollection<MyDataClass>))); 

    public ObservableCollection<MyDataClass> Items 
    { 
     get { return (ObservableCollection<MyDataClass>) GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 
} 

. 버튼을 클릭하면 CreateViewButtonClicked 메서드가 호출되고 GridView이 생성되고 이전에 초기화 된 열이 Columns 컬렉션에 추가 된 다음 ViewListView으로 설정됩니다.

출력 :

enter image description here

2

CellTemplate(DataTemplate)FrameworkElementFactory으로 VisualTree을 설정하는 것입니다 만들 필수 : ​​

// Image 
var imageFactory = new FrameworkElementFactory(typeof(Image)); 
imageFactory.SetValue(WidthProperty, 15); 
imageFactory.SetValue(HeightProperty, 15); 
imageFactory.SetBinding(Image.SourceProperty, new Binding("Icon")); 
imageFactory.SetValue(DockPanel.DockProperty, Dock.Left); 

// Label 
var labelFactory = new FrameworkElementFactory(typeof(Label)); 
labelFactory.SetBinding(ContentProperty, new Binding("Column1_Content")); 
labelFactory.SetValue(WidthProperty, 180); 
labelFactory.SetValue(FontSizeProperty, 12); 
labelFactory.SetValue(HorizontalContentAlignmentProperty, HorizontalAlignment.Left); 
labelFactory.SetValue(DockPanel.DockProperty, Dock.Left); 

// DockPanel 
var dockPanelFactory = new FrameworkElementFactory(typeof(DockPanel)); 
dockPanelFactory.AppendChild(imageFactory); 
dockPanelFactory.AppendChild(labelFactory); 

GridViewColumn Column_1 = new GridViewColumn() 
{ 
    Header = "Column_1", 
    Width = 200 
}; 

DataTemplate template = new DataTemplate 
{ 
    VisualTree = dockPanelFactory 
}; 

Column_1.CellTemplate = template; 
+0

내가 그것을 코드에 DataTemplate을 만들 수있는 좋은 방법 같아요. – lindexi

+0

그냥 테스트하고 매력처럼 작동합니다. 하나의 수정 사항 : 두 항목의 WidthProperty/HeightProperty를 FrameWorkElement.WidthProperty, FrameWorkElement.HeightProperty로 대체했습니다. FontSizeProperty 및 HorizontalAlignmentProperty에 Label.FontSizeProperty 및 Label.HorizontalAlignmentProperty를 지정하고 숫자 값을 15.0 등으로 설정합니다. – Andrei

관련 문제