带有画布的WPF列表框仅显示最后一项

时间:2017-08-31 19:39:36

标签: wpf canvas listbox

我有一个带有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被添加到可视化树中。但我看不到它们。只添加了最后一项。

这就像跑步一样(只显示一个项目)

enter image description here

这就是它在设计师中的样子以及它应该如何运行

enter image description here

有什么建议吗?

更新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);

1 个答案:

答案 0 :(得分:1)

XAML工作正常,你已经确认只创建了一个viewmodel副本,因此只有一个Items集合,第一个drop工作。

看看你的代码,突然发现的是这一行:

var comp = e.Data.GetData(typeof(DrawingComponent).FullName) as DrawingComponent;

那不是创造DrawingComponent;它是从帽子中拉出一个其他东西放入的帽子。我在那里放了一个断点,看看你是否真的在Items中获得了多个项目,但它们都是相同的实际对象实例,具有相同的属性值。

或者我直接转到启动拖动的代码,并确保每次都创建一个新的DrawingComponent - 或者每次都创建一个克隆在下降端。尽管如此,在拖动端执行此操作似乎更好,因为您可以从不同的源拖动DrawingComponent的不同子类,并且丢弃代码不需要担心它。