WPF UserControl выставляет внутренние списки - PullRequest
1 голос
/ 09 сентября 2009

Я пытаюсь написать UserControl для отображения списка элементов, каждый из которых представляет собой заголовок и группу флажков. Это целое будет представлять собой форму данных, где человек, заполняющий ее, отвечает на список вопросов со значением от 1 до 4. Все это работает и хорошо привязывается к ViewModel окна.

Но в настоящее время я получил жестко запрограммированные ответы в UserControl следующим образом:

<ListBox
  ItemsPanel="{StaticResource HorizontalScores}"
  Style="{StaticResource styleOuterListBox}"
  ItemContainerStyle="{StaticResource styleOuterListBoxItem}">
  <ListBoxItem>Never</ListBoxItem>
  <ListBoxItem>Sometimes</ListBoxItem>
  <ListBoxItem>Often</ListBoxItem>
  <ListBoxItem>Always</ListBoxItem>
</ListBox>

Я хотел бы установить их из XAML окна или из ViewModel, так как они будут отличаться для других форм, но не могут видеть правильное заклинание. Как удалить ListBoxItems из UserControl и использовать вместо этого привязку данных?

BigEdit ...

Хорошо, это фактический пользовательский элемент управления (выглядит отвратительно, но это не главное):

<UserControl x:Class="BussPerry.Scorer" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:BussPerry.ViewModel" xmlns:local="clr-namespace:BussPerry">

  <UserControl.Resources>

    <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="Gray" />
    <SolidColorBrush x:Key="SelectedForegroundBrush" Color="Red" />

    <ItemsPanelTemplate x:Key="HorizontalScores">
      <StackPanel Orientation="Horizontal" />
    </ItemsPanelTemplate>

    <Style x:Key="styleListBox" TargetType="{x:Type ListBox}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListBox}">
            <ItemsPresenter Margin="2" />
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

    <Style x:Key="styleListBoxItem" TargetType="{x:Type ListBoxItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListBoxItem}">
            <CheckBox Name="CheckBox" Padding="1" Width="60" 
                          IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
              <ContentPresenter HorizontalAlignment="Center"/>
            </CheckBox>
            <ControlTemplate.Triggers>
              <Trigger Property="IsSelected" Value="True">
                <Setter TargetName="CheckBox" Property="Background" Value="{StaticResource SelectedBackgroundBrush}" />
                <Setter TargetName="CheckBox" Property="Foreground" Value="{StaticResource SelectedForegroundBrush}" />
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

  </UserControl.Resources>

  <ListBox ItemsPanel="{StaticResource HorizontalScores}" Style="{StaticResource styleListBox}" 
      ItemContainerStyle="{StaticResource styleListBoxItem}" SelectedIndex="{Binding Path=Score}">
    <ListBoxItem>Never</ListBoxItem>
    <ListBoxItem>Sometimes</ListBoxItem>
    <ListBoxItem>Often</ListBoxItem>
    <ListBoxItem>Always</ListBoxItem>
  </ListBox>

</UserControl>

И это называется следующим образом:

<ListView
  Name="listviewScores"
  ItemsSource="{Binding Path=Scores}"

  Margin="5"
  BorderThickness="0"
  Background="Transparent"
  Focusable="False"
  Grid.Row="3">
  <ListView.View>
    <GridView
      ColumnHeaderContainerStyle="{StaticResource styleHiddenHeader}">
      <GridView.Columns>

        <GridViewColumn>
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <TextBlock
                Text="{Binding Path=Index}"
                HorizontalAlignment="Right" />
              </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>

        <GridViewColumn
          DisplayMemberBinding="{Binding Path=Title}" />

        <GridViewColumn >
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <local:Scorer >
              </local:Scorer>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
      </GridView.Columns>
    </GridView>
  </ListView.View>

</ListView>

То, что я хочу сделать, это переместить элементы списка Никогда / Иногда / Часто / Всегда из жесткого кода в пользовательском элементе управления для привязки к данным.

(Предложения «Вы не хотите делать это так» тоже приветствуются!)

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

(через год ...)

Я думаю, что ваш вопрос похож на мой. Я придумал технику для предоставления ItemsSource внутреннего элемента управления в UserControl. Ссылка на мой вопрос здесь:

Предоставление внутренних управляющих свойств для связывания в WPF

Я знаю, что мое решение работает. Чего я не знаю, так это того, нарушает ли это какие-то священные «лучшие практики» в WPF. Хотя он чувствует себя хорошо.

0 голосов
/ 09 сентября 2009

Хотите связать коллекцию со списком?

Все довольно просто ...

<ListBox ItemsSource="{Binding Answers}" />

где ответы - это ваша коллекция, отображаемая в вашей модели представления.

Если у вас возникли проблемы с созданием пользовательского элемента управления, который предоставляет ItemsSource, тогда вам просто нужно наследовать от ItemsControl, а не просто UserControl.

EDIT: Некоторые предположения:

  • DataContext элемента ListBox, пользовательского элемента управления или вышестоящего родительского элемента установлен на ваш ViewModel.
  • ViewModel имеет Свойство называется «Ответы».
  • Свойство ответов реализует IEnumerable <>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...