我有一个带有Canvas的ListBox作为ItemsPanel。
<UserControl.Resources>
<DataTemplate x:Key="itemTemplate">
<Border BorderBrush="LightBlue" BorderThickness="1">
<Grid Margin="0,2,2,2" Width="{Binding Width}" Height="{Binding Height}">
<Rectangle Cursor="Hand" Fill="AliceBlue"
MouseDown="Rectangle_MouseDown"
MouseMove="Rectangle_MouseMove"
MouseUp="Rectangle_MouseUp"/>
<Label Content="{Binding Name}" Margin="5" IsHitTestVisible="False"/>
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
<ListBox ItemsSource="{Binding Items}"
x:Name="listBox"
SelectionMode="Extended"
ItemTemplate="{StaticResource itemTemplate}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="Transparent"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
问题是每当我向Item添加一个新项目时,Listbox绑定到它,它只会在屏幕上显示新项目。列表中的所有先前项目均未显示。我可以看到所有项目确实都在Items列表中,ListBoxItems被添加到可视化树中。但我看不到它们。只添加了最后一项。
这就像跑步一样(只显示一个项目)
这就是它在设计师中的样子以及它应该如何运行
有什么建议吗?
更新1
设计师使用的代码就是这个
public class DrawingPanelViewModelMockup: DrawingPanelViewModel
{
public DrawingPanelViewModelMockup()
{
//Pc subclasses DrawingComponent
var pc = new Pc();
pc.Name = "PC";
pc.X = 20;
pc.Y = 40;
pc.Width = 100;
pc.Height = 50;
Items.Add(pc);
...
}
}
添加到Items(ObservableCollection)的真实代码是这样的。它是Drag-n-drop操作的一部分。
var comp = e.Data.GetData(typeof(DrawingComponent).FullName) as DrawingComponent;
var drawingPanelVm = ServiceLocator.Current.GetInstance<DrawingPanelViewModel>();
comp.X = mousePos.X;
comp.Y = mousePos.Y;
comp.Width = 100;
comp.Height = 50;
drawingPanelVm.Items.Add(comp);
答案 0 :(得分:1)
XAML工作正常,你已经确认只创建了一个viewmodel副本,因此只有一个Items
集合,第一个drop工作。
看看你的代码,突然发现的是这一行:
var comp = e.Data.GetData(typeof(DrawingComponent).FullName) as DrawingComponent;
那不是创造DrawingComponent
;它是从帽子中拉出一个其他东西放入的帽子。我在那里放了一个断点,看看你是否真的在Items
中获得了多个项目,但它们都是相同的实际对象实例,具有相同的属性值。
或者我直接转到启动拖动的代码,并确保每次都创建一个新的DrawingComponent
- 或者每次都创建一个克隆在下降端。尽管如此,在拖动端执行此操作似乎更好,因为您可以从不同的源拖动DrawingComponent
的不同子类,并且丢弃代码不需要担心它。