![](/img/trans.png)
[英].NET MAUI - How to bind on a property of an ObservableCollection Item
[英]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的屬性(例如Picture
或Parameter
有效解決方案。
我希望有一些想法:)謝謝,亞歷克斯
數據模板和綁定源屬性通過反射解決。 因此,如果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.