我试图在画布上“抛出”几个对象。 我有5种类型的具有多个属性的对象(如文本,位置,位图等)
每种类型应该以不同的方式呈现(一种类型将呈现为文本块,一种类型呈现为bitmapImage,等等)。
我有5个observableCollections,它们包含所有相同类型的对象。
我可以将其中一个(例如代表文本的那个)绑定到画布上,并使用带有文本块的数据模板将每个属性绑定到正确的参数(如可见性和局部性)。
现在我的第二种类型应该绑定到一个位图。
我该怎么做?如何将5种不同类型绑定到画布并将每种类型转换为正确的元素?
一种可能的方法是将所有集合聚合为一个集合......但是它会尝试将所有集合转换为第一个类型......
答案 0 :(得分:4)
有一个great answer以某种方式相关的问题我们可以扩展以使其适用于您的问题。
假设我们有两种类型可以放到Canvas:
public class TextClass
{
public string Text { get; set; }
}
public class RectangleClass
{
public Brush FillBrush { get; set; }
}
为了便于使用集合绑定,我们可以使用我提到的答案中的代码,但更改ItemTemplate
的自定义DataTemplateSelector
:
<ItemsControl Name="icMain">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Left}" />
<Setter Property="Canvas.Top" Value="{Binding Top}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplateSelector>
<TestWPF:CustomTemplateSelector>
<TestWPF:CustomTemplateSelector.TextTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</TestWPF:CustomTemplateSelector.TextTemplate>
<TestWPF:CustomTemplateSelector.RectangleTemplate>
<DataTemplate>
<Rectangle Height="25" Width="25" Fill="{Binding FillBrush}" />
</DataTemplate>
</TestWPF:CustomTemplateSelector.RectangleTemplate>
</TestWPF:CustomTemplateSelector>
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
那是我使用的模板选择器:
public class CustomTemplateSelector: DataTemplateSelector
{
public DataTemplate TextTemplate { get; set; }
public DataTemplate RectangleTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is TextClass)
return TextTemplate;
else if (item is RectangleClass)
return RectangleTemplate;
else return base.SelectTemplate(item, container);
}
}
那么,剩下的就是绑定我们的收藏品。我在代码后面使用简单的List
进行测试:
List<object> aggregation = new List<object>()
{
new TextClass() { Text = "Some test text" },
new RectangleClass() { FillBrush = new SolidColorBrush(Colors.Tomato)}
};
icMain.ItemsSource = aggregation;
此代码显示一些测试文本和美味的番茄矩形。这些样本对象没有任何定位逻辑,但我认为你已经有了这个。