WPF XAML Bind Grid - PullRequest
       34

WPF XAML Bind Grid

0 голосов
/ 25 мая 2010

У меня есть пользовательский элемент управления, основанный на элементе управления Grid. У меня есть ViewModel, которая представляет это как свойство. Я хотел бы, чтобы XAML, по мнению, связывался с этим. Я уверен, что это должно быть легко, но я новичок в WPF. Как это достигается?

Большое спасибо заранее

(отредактировано для добавления дополнительной информации)

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

<MyCustomGrid:CustomGrid>
   <MyCustomGrid:CustomStackPanel>
      <MyCustomGrid:CustomHeaderedContentControl/>
   </MyCustomGrid:CustomStackPanel>
   <MyCustomGrid:CustomStackPanel>
      <MyCustomGrid:CustomHeaderedContentControl/>
   </MyCustomGrid:CustomStackPanel>
</MyCustomGrid:CustomGrid>

ViewModel просто содержит список, который содержит список и т. Д. Обратите внимание, что CustomGrid - это список, поскольку их может быть несколько, но будет привязан только один с определенным свойством.

Ответы [ 2 ]

0 голосов
/ 25 мая 2010

Основные шаги

  1. Установите для DataContext пользовательского элемента управления (или элемента управления / окна, содержащего ваш пользовательский элемент управления) некоторый экземпляр типа модели со свойством Data, равным ObservableCollection<SomeDataType>.

  2. Привязать ListView ItemSource к свойству Data.

  3. Свяжите свойство GridViewColumn DisplayMemberBinding со свойствами SomeDataType.

Таким образом, у вас будет что-то вроде этого:

<ListView SelectionMode="Single"
          HorizontalAlignment="Stretch"
          ItemsSource="{Binding Data}">
    <ListView.View>
        <GridView >
            <GridViewColumn Header="Name of Prop2"
                            DisplayMemberBinding="{Binding Path=Prop1}" />
            <GridViewColumn Header="Name of Prop2"
                            DisplayMemberBinding="{Binding Path=Prop2}" />
            <GridViewColumn Header="Name of Prop3"
                            DisplayMemberBinding="{Binding Path=Prop3}" />
        </GridView>
    </ListView.View>
</ListView>

Вы можете связываться с другими типами, контролировать форматирование и т. Д., Но это простой случай.

0 голосов
/ 25 мая 2010

Я до сих пор не уверен, чего именно вы хотите достичь, но я все равно пойду, и, возможно, мы сможем найти решение оттуда.

Судя по вашему XAML, у вас есть несколько пользовательских элементов управления. Вы упомянули, что верхний уровень основан на Grid. Является ли Grid элементом управления или элементом ItemPanelTemplate для ItemsControl?

У меня возникает ощущение, что вы хотите, чтобы данные связывали содержимое вашей viewmodel, и для этого вам нужно основывать свои собственные элементы управления на ItemsControl. Поправь меня, если я ошибаюсь.

Примерно так (как уже упоминалось, это предполагает MyCustomGrid в качестве ItemsControl:

<UserControl Name="MyCustomGrid">
            <ItemsControl ItemsSource="{Binding Path=MyStackPanelsCollection}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid IsItemsHost="True" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="{x:Type MyCustomGrid:MyCustomStackPanel}">
                        <Setter Property="Grid.Row" Value="{Binding Path=GridRow}" />
                        <Setter Property="Grid.Column" Value="{Binding Path=GridColumn}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="{x:Type MyCustomGrid:MyCustomStackPanelViewModel}">
                        <ContentPresenter Content="{Binding Path=MySerializedObjectTurnedInToControl}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </UserControl>

Если это не так, поскольку вы привязываете свою CustomStackPanel и т. Д. Непосредственно к одному именованному свойству в вашей модели представления, это может выглядеть примерно так:

<MyCustomGrid:CustomGrid DataContext="{Binding Path=ViewModel}">
   <MyCustomGrid:CustomStackPanel DataContext="{Binding Path=MyFirstStackPanelViewModel}">

...

Извините, если я все еще неправильно понял, я вполне мог упустить что-то очевидное.

...