Привязка шаблона XAML по горизонтали

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

        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 и установить горизонтальное направление повторения и привязать. Есть ли эквивалентный способ, который менее императивен и более декларативен (т. е. сделан заранее с помощью шаблона и с использованием общих средств «привязки данных»)?


person t3rse    schedule 13.01.2009    source источник


Ответы (3)


<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).

person Kent Boogaart    schedule 13.01.2009
comment
Это переносится, когда достигает правой границы контейнера? - person AnthonyWJones; 13.01.2009
comment
Я не уверен, как обернуть даже факторы в этот вопрос. Если вам нужно что-то завернуть, используйте соответствующий контейнер. StackPanel не является подходящим контейнером для упаковки. - person Kent Boogaart; 13.01.2009
comment
@Kent - спасибо, но это то, с чего я начал, и AnthonyWJones прав, что это не переносится. Я думаю, что начну с панели Wrap Panel из набора инструментов Silverlight. - person t3rse; 13.01.2009
comment
Как я уже сказал, StackPanel не переносится. Вместо этого используйте сетку и используйте группы общего размера. - person Kent Boogaart; 16.01.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 с горизонтальной ориентацией обеспечивает бесперебойную работу.

person t3rse    schedule 13.01.2009

инструментарий Silverlight содержит панель переноса.

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

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

person AnthonyWJones    schedule 13.01.2009
comment
В полной реализации WPF уже есть WrapPanel. В Silverlight его еще не было, поэтому они добавили его в Silverlight Toolkit. То же самое касается DockPanel. - person Bryan Anderson; 14.01.2009