第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

ItemsControl 包裝問題

ItemsControl 包裝問題

C#
慕碼人2483693 2022-11-21 16:54:42
我做了一些小的自定義 ItemsControl 來將一些列表顯示為項(xiàng)目行。它幾乎完美地工作。<ItemsControl.ItemTemplate>    <DataTemplate>       <WrapPanel Orientation="Horizontal">           <TextBlock x:Name="delimiter" Text=";" Margin="0 0 5 0"/>           <TextBlock Text="{Binding LinkId}" />       </WrapPanel>       <DataTemplate.Triggers>          <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">              <Setter Property="Visibility" TargetName="delimiter" Value="Collapsed"/>          </DataTrigger>        </DataTemplate.Triggers>    </DataTemplate></ItemsControl.ItemTemplate>我的問題在定界符中:當(dāng) ItemsConteol 換行到下一行時(shí),定界符 char 會(huì)從下一行開始。我知道問題出在哪里,但我不知道如何解決。
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊

我有一個(gè)簡單的解決方案DataTemplateSelector。它是這樣的:


您定義一個(gè)選擇器,用于區(qū)分最后一項(xiàng)。


class LastElementSelector : DataTemplateSelector

{

    public DataTemplate NormalTemplate { get; set; }

    public DataTemplate LastTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)

    {

        return IsLast(container) ? LastTemplate : NormalTemplate;

    }


    bool IsLast(DependencyObject container)

    {

        var itemsControl = FindParentOrSelf<ItemsControl>(container);

        var idx = itemsControl.ItemContainerGenerator.IndexFromContainer(container);

        var count = itemsControl.Items.Count;

        return idx == count - 1;

    }


    T FindParentOrSelf<T>(DependencyObject from) where T : DependencyObject

    {

        for (var curr = from; curr != null; curr = VisualTreeHelper.GetParent(curr))

            if (curr is T t)

                return t;

        return null;

    }

}

有了這個(gè),您可以對(duì)普通項(xiàng)目和最后項(xiàng)目使用不同的模板:


<ItemsControl ItemsSource="{Binding}">

    <ItemsControl.ItemsPanel>

        <ItemsPanelTemplate>

            <WrapPanel IsItemsHost="True"/>

        </ItemsPanelTemplate>

    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplateSelector>

        <local:LastElementSelector>

            <local:LastElementSelector.NormalTemplate>

                <DataTemplate>

                    <TextBlock>

                        <Run Text="{Binding Mode=OneWay}"/><!-- no space between runs

                        --><Run Text="; " Foreground="Red" FontWeight="Bold"/>

                    </TextBlock>

                </DataTemplate>

            </local:LastElementSelector.NormalTemplate>

            <local:LastElementSelector.LastTemplate>

                <DataTemplate>

                    <TextBlock Text="{Binding}"/>

                </DataTemplate>

            </local:LastElementSelector.LastTemplate>

        </local:LastElementSelector>

    </ItemsControl.ItemTemplateSelector>

</ItemsControl>

結(jié)果:

https://i.stack.imgur.com/RIcQR.gif


查看完整回答
反對(duì) 回復(fù) 2022-11-21
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

您的定界符位于下一行的前面,因?yàn)樗挥?LinkId TextBox 的前面,并且它們都在 WrapPanel 中綁定在一起。整個(gè) WrapPanel 流向下一行。

WrapPanels 上方的父面板不知道也不關(guān)心其中的內(nèi)容。

http://img1.sycdn.imooc.com//637b3d0700012ba406530160.jpg

順便說一下,我不知道這是否是您的意圖,但在您編寫的代碼中,您為集合中的每個(gè)項(xiàng)目生成了一個(gè)不同的 WrapPanel。目前,您的測(cè)試列表中有 20 個(gè) WrapPanel。


如果像您所說的那樣,最后一個(gè)分隔符不是問題,那么這是一個(gè)足夠好的解決方案:


    <ItemsControl

        ItemsSource="{Binding YourItems}"

        >

        <ItemsControl.ItemsPanel>

        <ItemsPanelTemplate>

            <WrapPanel

                Orientation="Horizontal"

                ></WrapPanel>

        </ItemsPanelTemplate>

        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>

            <DataTemplate>

                <StackPanel

                    Orientation="Horizontal"

                    >

                    <TextBlock

                        Text="{Binding LinkId}"

                        ></TextBlock>

                    <TextBlock

                        Text="; "

                        ></TextBlock>

                </StackPanel>

            </DataTemplate>

        </ItemsControl.ItemTemplate>

    </ItemsControl>

如果這僅用于數(shù)據(jù)顯示目的,請(qǐng)考慮那些行中的文本框很可能是文本框內(nèi)的單個(gè)字符串。也許您可以使用單一格式的字符串并將相關(guān)部分制作成鏈接。這會(huì)將操作的字符串分隔符部分移至 ViewModel,并會(huì)大大簡化您的 XAML 代碼。


查看完整回答
反對(duì) 回復(fù) 2022-11-21
?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

您可以嘗試將定界符放在文本之后,并通過將其屬性設(shè)置為空字符串來隱藏最后一個(gè)Run元素:Text


<ItemsControl AlternationCount="{Binding RelativeSource={RelativeSource Self}, Path=Items.Count}">

    <ItemsControl.ItemsPanel>

        <ItemsPanelTemplate>

            <WrapPanel Orientation="Horizontal" />

        </ItemsPanelTemplate>

    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>

        <DataTemplate>

            <TextBlock>

                <Run Text="{Binding Path=., Mode=OneWay}" /><Run x:Name="delimiter" Text=";    "/>

            </TextBlock>

            <DataTemplate.Triggers>

                <Trigger Property="ItemsControl.AlternationIndex" Value="0">

                    <Setter Property="Text" TargetName="delimiter" Value=""/>

                </Trigger>

            </DataTemplate.Triggers>

        </DataTemplate>

    </ItemsControl.ItemTemplate>

</ItemsControl>

這應(yīng)該使分隔符和文本保持在同一行。


查看完整回答
反對(duì) 回復(fù) 2022-11-21
  • 3 回答
  • 0 關(guān)注
  • 149 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)