WPF - 用于切碎元件的可扩展控制的面板

时间:2015-01-06 11:09:56

标签: c# wpf mvvm panel

我有一个具有最小化控件的应用程序。最小化的项目显示在水平堆栈面板中。由于空间太小,应用项目的调整大小(缩小)可能会被切断 为了避免这种情况,我的想法是将切碎的元素移动到可扩展控件(like this

应用程序遵循MVVM模式,面板中的项目位于绑定到视图模型的ItemsControl中。

我现在的实现是使用一个自定义面板,其中使用属性“SpillOverElements”分发切碎的元素。我想将另一个控件(面板,扩展器或弹出窗口)绑定到此属性。问题是我无法绑定到ItemsControl中“SpillOverPanel”的“SpillOverElements”属性。

<ItemsControl>
    ItemTemplate="{StaticResource DummyContentDataTemplate}"
    ItemsSource="{Binding DisplayElementsCollection}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:SpillOverPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
</ItemsControl>  

所以问题是如何绑定到“SpillOverPanel”的“SpillOverElements”属性。任何其他想法如何实现这一点也是受欢迎的。我不确定我的方式是否正确。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

请原谅我,下面的文字中有很多spitballing。

单个可重用的ItemsControl类

这可能是一个相当复杂的实施。对于溢出控件中显示的项目,您可能需要以“SpilloverItemsControl”类和“SpilloverItem”类的形式创建全新的WPF控件,以用作项容器。 SpilloverItemsControl类当然会继承自ItemsControl

SpilloverItem容器将公开一个属性 - “IsSpilledOver”(或类似的东西),父控件将根据各种大小和可见性计算自动设置为truefalse

您的SpilloverItemsControl类将作为一种复合控件布局,在其ControlTemplate中提供2个不同的ItemsControl - 如果“IsSpilledOver”设置为“false”,则其项目的Visibility将设置为Visible,并设置为'Collapsed ' 如果不;另一个用作“溢出”区域,仅显示“IsSpilledOver”设置为true的项目。

替代方法

另一种方法,但可重用性稍差,是在项目ViewModel中存在“IsSpilledOver”属性,并创建一个最小Behavior来确定何时应将其设置为true或false。然后在您的视图中,您将再次将两个不同的ItemsControl绑定到同一个集合。一个用于显示“非溢出”项目,另一个用于显示“溢出”项目。此处的可见性将在ItemTemplate中设置。