Как да използвате DataTemplate на WrapPanel

Имам WrapPanel, за да покажа някои елементи. Но искам да използвам DataTemplate, за да ги покажа. Ето моя XAML код на WrapPanel

<WrapPanel Margin="10,57,12,10" x:Name="wrp1">
        <WrapPanel.Resources>
            <DataTemplate DataType="{x:Type local:DateItem}">
                <Grid VerticalAlignment="Top" HorizontalAlignment="Stretch" Width="250" Height="300" Background="Blue">
                    <Label Content="{Binding Path=DateString}" FontSize="20" Cursor="Hand" Foreground="White" Background="Red" FontWeight="Bold" VerticalAlignment="Bottom" HorizontalAlignment="Left" Height="38" VerticalContentAlignment="Center" Padding="5,0,5,0"/>
                </Grid>
            </DataTemplate>
        </WrapPanel.Resources>
    </WrapPanel>

И това е кодът на DateItem

 public class DateItem : UIElement
{
    public string DateString { get; set; }
}

Когато прозорецът се инициализира, създавам един DateItem с параметър DateString и го добавям към WrapPanel като дете.

  DateItem di = new DateItem();
  di.DateString = "28.04.2014";
  wrp1.Children.Add(di);

Мисля, че всичко е наред, но панелът за обвиване не показва нищо :(

Можете ли да ми помогнете с това?


person cKNet    schedule 21.09.2014    source източник


Отговори (1)


Объркали сте контролите на потребителския интерфейс с DataTemplates, които се използват за определяне на представянето на вашите данни. За да изобразите данни, трябва да зададете съдържание на контрола, което може да се направи с помощта на ContentControl. Освен това можете да използвате ItemsControl, ако искате да добавите няколко пъти.

XAML:

<WrapPanel x:Name="wrp1">
    <WrapPanel.Resources>
        <DataTemplate DataType="{x:Type local:DateItem}">
            <Grid VerticalAlignment="Top" HorizontalAlignment="Stretch" Width="250"
                  Height="300" Background="Blue">
                <Label Content="{Binding Path=DateString}" FontSize="20" Cursor="Hand"
                       Foreground="White" Background="Red" FontWeight="Bold" 
                       VerticalAlignment="Bottom" HorizontalAlignment="Left"
                       Height="38" VerticalContentAlignment="Center"
                       Padding="5,0,5,0"/>
            </Grid>
        </DataTemplate>
    </WrapPanel.Resources>
    <ItemsControl x:Name="itemsControl"/>
</WrapPanel>

Код отзад:

DateItem di = new DateItem();
di.DateString = "28.04.2014";
itemsControl.Items.Add(di);

Елемент от дата:

public class DateItem
{
    public string DateString { get; set; }
}

В случай, че все още се интересувате от изобразяването му като контрола, трябва да дефинирате стил по подразбиране, а не шаблон по подразбиране.

XAML:

<WrapPanel x:Name="wrp1">
    <WrapPanel.Resources>
        <Style TargetType="{x:Type local:DateItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid VerticalAlignment="Top" HorizontalAlignment="Stretch"
                              Width="250" Height="300" Background="Blue">
                            <Label
                               Content="{Binding Path=DateString, RelativeSource=
                                            {RelativeSource Mode=TemplatedParent}}" 
                               FontSize="20" Cursor="Hand" Foreground="White"
                               Background="Red" FontWeight="Bold"
                               VerticalAlignment="Bottom"
                               HorizontalAlignment="Left"
                               Height="38" VerticalContentAlignment="Center" 
                               Padding="5,0,5,0"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </WrapPanel.Resources>
</WrapPanel>

Код отзад:

DateItem di = new DateItem();
di.DateString = "28.04.2014";
wrp1.Children.Add(di);

Елемент от дата:

public class DateItem : Control
{
    public string DateString { get; set; }
}
person Rohit Vats    schedule 21.09.2014
comment
Здравейте, благодаря ви за отговора, но и той не работи. или не мога да го накарам да работи. Имам още нещо, ще добавя DateItem няколко пъти. Как мога да постигна това? - person cKNet; 21.09.2014
comment
Първият елемент определено работи за мен. Както и да е, ако все още искате да се рендира като контрола, имате нужда от стил по подразбиране. Вижте актуализирания отговор за втори подход. - person Rohit Vats; 21.09.2014
comment
Съжаляваме, първият работи. Добре, как мога да добавя DateItem няколко пъти с помощта на първата проба? - person cKNet; 21.09.2014
comment
Можете да използвате ItemsControl. Актуализирах отговора. - person Rohit Vats; 21.09.2014
comment
Много благодаря! Работи като чар! - person cKNet; 21.09.2014
comment
Според първия код, когато добавям елементи към ItemsControl, WrapPanel не означава нищо. Целта ми е да добавя ЕДНА хоризонтално разтегната МРЕЖА и да добавя няколко миниатюри на изображения с решетки, след което да добавя още една хоризонтално разтегната решетка и отново миниатюри... С този код просто добавям елементи ВЪТРЕ в ItemsContainer, така че WrapPanel не работи както исках. - person cKNet; 21.09.2014
comment
Това е, което всъщност искам. community.devexpress.com/blogs/theprogressbar/ - person cKNet; 22.09.2014
comment
Трябва да зададете ItemsPaneTempalte като WrapPanel за ItemsControl за това. Вижте третия пример тук. - person Rohit Vats; 22.09.2014
comment
можеш ли да провериш този въпрос? връзка - person cKNet; 25.09.2014