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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以為WPF組合框中的選定項目使用與下拉部分中的項目不同的模板嗎?

我可以為WPF組合框中的選定項目使用與下拉部分中的項目不同的模板嗎?

當年話下 2019-10-19 14:40:22
我有一個WPF組合框,里面裝有客戶對象。我有一個DataTemplate:<DataTemplate DataType="{x:Type MyAssembly:Customer}">    <StackPanel>        <TextBlock Text="{Binding Name}" />        <TextBlock Text="{Binding Address}" />    </StackPanel></DataTemplate>這樣,當我打開組合框時,可以看到不同的客戶及其名稱,然后在其下方顯示地址。但是,當我選擇一個客戶時,我只想在組合框中顯示名稱。就像是:<DataTemplate DataType="{x:Type MyAssembly:Customer}">    <StackPanel>        <TextBlock Text="{Binding Name}" />    </StackPanel></DataTemplate>我可以為組合框中的選定項目選擇另一個模板嗎?解在答案的幫助下,我這樣解決了它:<UserControl.Resources>    <ControlTemplate x:Key="SimpleTemplate">        <StackPanel>            <TextBlock Text="{Binding Name}" />        </StackPanel>    </ControlTemplate>    <ControlTemplate x:Key="ExtendedTemplate">        <StackPanel>            <TextBlock Text="{Binding Name}" />            <TextBlock Text="{Binding Address}" />        </StackPanel>    </ControlTemplate>    <DataTemplate x:Key="CustomerTemplate">        <Control x:Name="theControl" Focusable="False" Template="{StaticResource ExtendedTemplate}" />        <DataTemplate.Triggers>            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}">                <Setter TargetName="theControl" Property="Template" Value="{StaticResource SimpleTemplate}" />            </DataTrigger>        </DataTemplate.Triggers>    </DataTemplate></UserControl.Resources>然后,我的ComboBox:<ComboBox ItemsSource="{Binding Customers}"                 SelectedItem="{Binding SelectedCustomer}"                ItemTemplate="{StaticResource CustomerTemplate}" />使它起作用的重要部分是Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}"(值應為x:Null,而不是True的部分)。
查看完整描述

3 回答

?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

使用上述DataTrigger / Binding解決方案存在兩個問題。首先,您實際上會收到一條綁定警告,提示您找不到所選項目的相對來源。但是,更大的問題是您已經(jīng)弄亂了數(shù)據(jù)模板,并使它們特定于ComboBox。


我更好地介紹的解決方案遵循WPF設計,因為它使用DataTemplateSelector,您可以在其上使用SelectedItemTemplate和DropDownItemsTemplate屬性以及兩者的“選擇器”變體來指定單獨的模板。


public class ComboBoxTemplateSelector : DataTemplateSelector

{

    public DataTemplate         SelectedItemTemplate          { get; set; }

    public DataTemplateSelector SelectedItemTemplateSelector  { get; set; }

    public DataTemplate         DropdownItemsTemplate         { get; set; }

    public DataTemplateSelector DropdownItemsTemplateSelector { get; set; }


    public override DataTemplate SelectTemplate(object item, DependencyObject container)

    {

        var itemToCheck = container;


        // Search up the visual tree, stopping at either a ComboBox or

        // a ComboBoxItem (or null). This will determine which template to use

        while(itemToCheck != null && !(itemToCheck is ComboBoxItem) && !(itemToCheck is ComboBox))

            itemToCheck = VisualTreeHelper.GetParent(itemToCheck);


        // If you stopped at a ComboBoxItem, you're in the dropdown

        var inDropDown = (itemToCheck is ComboBoxItem);


        return inDropDown

            ? DropdownItemsTemplate ?? DropdownItemsTemplateSelector?.SelectTemplate(item, container)

            : SelectedItemTemplate  ?? SelectedItemTemplateSelector?.SelectTemplate(item, container); 

    }

}

注意:為簡單起見,我的示例代碼在此處使用新的“?”。C#6(VS 2015)的功能。如果您使用的是舊版本,只需刪除“?” 并在調(diào)用上面的“ SelectTemplate”之前顯式檢查null,否則返回null,如下所示:


return inDropDown

    ? DropdownItemsTemplate ??

        ((DropdownItemsTemplateSelector != null)

            ? DropdownItemsTemplateSelector.SelectTemplate(item, container)

            : null)

    : SelectedItemTemplate ??

        ((SelectedItemTemplateSelector != null)

            ? SelectedItemTemplateSelector.SelectTemplate(item, container)

            : null)

為了方便在XAML中使用,我還包括一個標記擴展,該擴展僅創(chuàng)建并返回上述類。


public class ComboBoxTemplateSelectorExtension : MarkupExtension

{

    public DataTemplate         SelectedItemTemplate          { get; set; }

    public DataTemplateSelector SelectedItemTemplateSelector  { get; set; }

    public DataTemplate         DropdownItemsTemplate         { get; set; }

    public DataTemplateSelector DropdownItemsTemplateSelector { get; set; }


    public override object ProvideValue(IServiceProvider serviceProvider)

    {

        return new ComboBoxTemplateSelector(){

            SelectedItemTemplate          = SelectedItemTemplate,

            SelectedItemTemplateSelector  = SelectedItemTemplateSelector,

            DropdownItemsTemplate         = DropdownItemsTemplate,

            DropdownItemsTemplateSelector = DropdownItemsTemplateSelector

        };

    }

}

這就是您的使用方式。干凈,整潔,美觀,模板保持“純凈”


注意:“是:”這是我在代碼中放置類的位置的xmlns映射。確保導入您自己的名稱空間,并根據(jù)需要更改“ is:”。


<ComboBox x:Name="MyComboBox"

    ItemsSource="{Binding Items}"

    ItemTemplateSelector="{is:ComboBoxTemplateSelector

        SelectedItemTemplate={StaticResource MySelectedItemTemplate},

        DropdownItemsTemplate={StaticResource MyDropDownItemTemplate}}" />

如果您愿意,也可以使用DataTemplateSelectors。


<ComboBox x:Name="MyComboBox"

    ItemsSource="{Binding Items}"

    ItemTemplateSelector="{is:ComboBoxTemplateSelector

        SelectedItemTemplateSelector={StaticResource MySelectedItemTemplateSelector},

        DropdownItemsTemplateSelector={StaticResource MyDropDownItemTemplateSelector}}" />

或混合搭配!在這里,我為所選項目使用模板,但為DropDown項目使用模板選擇器。


<ComboBox x:Name="MyComboBox"

    ItemsSource="{Binding Items}"

    ItemTemplateSelector="{is:ComboBoxTemplateSelector

        SelectedItemTemplate={StaticResource MySelectedItemTemplate},

        DropdownItemsTemplateSelector={StaticResource MyDropDownItemTemplateSelector}}" />

另外,如果您沒有為選定的項目或下拉菜單項指定Template或TemplateSelector,它又會像您期望的那樣退回到基于數(shù)據(jù)類型的常規(guī)數(shù)據(jù)模板解析。因此,例如,在以下情況下,所選項目的顯式設置已明確設置,但下拉菜單將繼承適用于數(shù)據(jù)上下文中對象的DataType的任何數(shù)據(jù)模板。


<ComboBox x:Name="MyComboBox"

    ItemsSource="{Binding Items}"

    ItemTemplateSelector="{is:ComboBoxTemplateSelector

        SelectedItemTemplate={StaticResource MyTemplate} />

請享用!


查看完整回答
反對 回復 2019-10-19
?
拉莫斯之舞

TA貢獻1820條經(jīng)驗 獲得超10個贊

我用了下一種方法


 <UserControl.Resources>

    <DataTemplate x:Key="SelectedItemTemplate" DataType="{x:Type statusBar:OffsetItem}">

        <TextBlock Text="{Binding Path=ShortName}" />

    </DataTemplate>

</UserControl.Resources>

<StackPanel Orientation="Horizontal">

    <ComboBox DisplayMemberPath="FullName"

              ItemsSource="{Binding Path=Offsets}"

              behaviors:SelectedItemTemplateBehavior.SelectedItemDataTemplate="{StaticResource SelectedItemTemplate}"

              SelectedItem="{Binding Path=Selected}" />

    <TextBlock Text="User Time" />

    <TextBlock Text="" />

</StackPanel>

和行為


public static class SelectedItemTemplateBehavior

{

    public static readonly DependencyProperty SelectedItemDataTemplateProperty =

        DependencyProperty.RegisterAttached("SelectedItemDataTemplate", typeof(DataTemplate), typeof(SelectedItemTemplateBehavior), new PropertyMetadata(default(DataTemplate), PropertyChangedCallback));


    public static void SetSelectedItemDataTemplate(this UIElement element, DataTemplate value)

    {

        element.SetValue(SelectedItemDataTemplateProperty, value);

    }


    public static DataTemplate GetSelectedItemDataTemplate(this ComboBox element)

    {

        return (DataTemplate)element.GetValue(SelectedItemDataTemplateProperty);

    }


    private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)

    {

        var uiElement = d as ComboBox;

        if (e.Property == SelectedItemDataTemplateProperty && uiElement != null)

        {

            uiElement.Loaded -= UiElementLoaded;

            UpdateSelectionTemplate(uiElement);

            uiElement.Loaded += UiElementLoaded;


        }

    }


    static void UiElementLoaded(object sender, RoutedEventArgs e)

    {

        UpdateSelectionTemplate((ComboBox)sender);

    }


    private static void UpdateSelectionTemplate(ComboBox uiElement)

    {

        var contentPresenter = GetChildOfType<ContentPresenter>(uiElement);

        if (contentPresenter == null)

            return;

        var template = uiElement.GetSelectedItemDataTemplate();

        contentPresenter.ContentTemplate = template;

    }



    public static T GetChildOfType<T>(DependencyObject depObj)

        where T : DependencyObject

    {

        if (depObj == null) return null;


        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)

        {

            var child = VisualTreeHelper.GetChild(depObj, i);


            var result = (child as T) ?? GetChildOfType<T>(child);

            if (result != null) return result;

        }

        return null;

    }

}

像魅力一樣運作。這里不太喜歡Loaded事件,但是您可以根據(jù)需要進行修復


查看完整回答
反對 回復 2019-10-19
  • 3 回答
  • 0 關注
  • 565 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號