簡體   English   中英

如何確定ObservableCollection中項目的指定類型 <object> 並綁定到WPF中的項目的屬性?

[英]How to determine the specifix type of a item in a ObservableCollection<object> and bind to a property of the item in wpf?

我有一個ObservableCollection<IContainers> Containers ,該ObservableCollection<IContainers> Containers定義了ObservableCollection<object> Content屬性。

public interface IContainers
{
   public double Height {get; set;}
   public double Width {get; set;}
   public ObservableCollection<object> Content {get; set;}
}

public class SetupStep
{
   public ObservableCollection<IContainer> Containers {get; set;}
}

Content屬性中的項目類型可以有所不同。 這些類型定義了我要綁定的自己的屬性。

這是我的.xaml代碼:

<c:ScatterView
   ItemsSource="{Binding Containers}">
   <c:ScatterView.ItemTemplate>
      <DataTemplate>
         <ListBox
            ItemsSource="{Binding Content}">
            <!--A way to determine my types in Contents?!?!-->
            <ListBox.Resources>
               <DataTemplate x:Key="{x:Type myObjects:Picture}">
                  <Image Source="{Binding Picture.FullFileName}"/>
               </DataTemplate>
               <DataTemplate x:Key="{x:Type myObjects:Parameter}">
                  <myControl:ParameterControl Id="{Binding Parameter.Id}"/>
               </DataTemplate>
            </ListBox.Resources>
            <!--A way to determine my types in Contents?!?!-->
         </ListBox>
      </DataTemplate>
   </c:ScatterView.ItemTemplate>
</c:ScatterView>

我找不到綁定到myObjects的屬性(例如PictureParameter有效解決方案。

我希望有一些想法:)謝謝,亞歷克斯

數據模板和綁定源屬性通過反射解決。 因此,如果Content集合包含一個Picture ,一個DataTemplate中Picture可以自動應用。

您唯一需要做的就是設置DataTemplate的DataType屬性:

<ListBox.Resources>
    <DataTemplate DataType="{x:Type myObjects:Picture}">
        <Image Source="{Binding Picture.FullFileName}"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type myObjects:Parameter}">
        <myControl:ParameterControl Id="{Binding Parameter.Id}"/>
    </DataTemplate>
</ListBox.Resources>

其他所有東西都應該開箱即用。

雖然您也可以使用DataTemplateSelector ,但是上述方法要簡單得多。 除非您要為同一類型的不同項目使用不同的DataTemplates,否則不需要使用DataTemplateSelector,例如,取決於item類的某些屬性的值。

您可能需要看一下DataTemplateSelector類 這使您可以根據不同的條件切換DataTemplate在您的情況下,此條件可以是列表項類型:

public class CustomDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is MainWindow.Picture)
            return PictureTemplate;
        if (item is MainWindow.Parameter)
            return ParameterTemplate;

        // return some default template as fall-back
    }

    public DataTemplate PictureTemplate { get; set; }
    public DataTemplate ParameterTemplate { get; set; }
    // ...add other template references here...
}

現在,您可以將所有模板定義為XAML資源,並且只需引用ListBox的TemplateSelector即可:

<Window.Resources>
    <DataTemplate x:Key="PictureTemplate">
        <Image Source="{Binding FullFileName}"/>
    </DataTemplate>
    <DataTemplate x:Key="ParameterTemplate">
        <myControl:ParameterControl Id="{Binding Id}"/>
    </DataTemplate>
    ...add other templates here...
    <local:CustomDataTemplateSelector x:Key="CustomDataTemplateSelector" 
                                      PictureTemplate="{StaticResource PictureTemplate}" 
                                      ParameterTemplate="{StaticResource ParameterTemplate}"/>
</Window.Resources>

<ListBox
    ItemsSource="{Binding Content}"
    ItemTemplateSelector="{StaticResource CustomDataTemplateSelector}">
</ListBox>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM