Шаблон XAML, привязка по горизонтали - PullRequest
0 голосов
/ 13 января 2009

Мне интересно, как можно использовать привязку данных шаблона для выполнения того, что производит следующий код (сетка флажков с некоторым связанным текстом):

        int tbIndex = 0;
        for (int i = 1; i < 5; i++) {
            StackPanel pan = new StackPanel();
            pan.Orientation = Orientation.Horizontal;
            pan.Margin = new Thickness(3);
            pan.Name = "RowPanel" + i;
            for (int j = 0; j < 3; j++) {
                CheckBox cb = new CheckBox();
                TextBlock block = new TextBlock();
                block.Width = 75;
                block.Text = "Item " + (++tbIndex).ToString();
                pan.Children.Add( cb );
                pan.Children.Add( block );
            }
            ContentPanel.Children.Add( pan );
        }

Например, в ASP.NET можно использовать DataList и установить направление повтора на горизонтальное и связывание. Есть ли эквивалентный способ, который является менее императивным и более декларативным (т.е. выполняется заранее с шаблоном и с использованием общих средств привязки данных)?

Ответы [ 3 ]

1 голос
/ 13 января 2009
<ItemsControl ItemsSource="{Binding YourListOfItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding YourIsChecked}"/>
                <TextBlock Text="{Binding YourText}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Предполагается, что у вас есть коллекция объектов в свойстве с именем YourListOfItems. В каждом из этих объектов предполагается наличие свойств, называемых YourIsChecked (bool) и YourText (возможно, string).

0 голосов
/ 14 января 2009

AnthonyWJones правильно считает, что Wrap Panel - это хороший подход, но Кент столкнулся с проблемой демонстрации того, как можно использовать ItemSource (хотя и со StackPanel, которая не достигает цели). Поэтому я выложу код, который демонстрирует декларативный эквивалент:

<ItemsControl x:Name="myItems" Width="300">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <controls:WrapPanel x:Name="itemsWrapPanel" Margin="0" Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Width="100">
                <CheckBox IsChecked="{Binding MyCheckedProperty, Mode=TwoWay}" x:Name="IsSelectedCheckBox" Height="25"></CheckBox>
                <TextBlock Height="12" Text="{Binding MyTextProperty}" Margin="0" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Небольшая ошибка в том, что DataTemplate ожидает одного дочернего элемента, поэтому использование StackPanel с горизонтальной ориентацией обеспечивает непрерывность работы.

0 голосов
/ 13 января 2009

Набор инструментов Silverlight имеет панель обтекания.

Вот описание этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...