【问题标题】:Binding single WPF control to multiple items将单个 WPF 控件绑定到多个项目
【发布时间】:2014-08-25 00:43:40
【问题描述】:

我正在尝试在我正在使用的编辑器中创建一个属性面板,我希望能够在其中修改视图中的多个选定项目。我想不出一个直接的“WPF”方式来做到这一点,它既不涉及大量代码背后的代码,也不涉及特定于类型的转换器或实现。对于完成这样的事情的最干净的方法有什么建议吗?只是为了具体一点,这就是我要说的:

右侧的“提示”作为 ItemsControl 实现,因此我将属性面板绑定到 SelectedItems 属性,如下所示:

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Count}" Value="1">
                    <Setter Property="Content" Value="{Binding Path=[0]}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

DataTrigger 确保面板仅在选择一个项目时可用,但我希望能够同时绑定到多个项目。理想情况下,源绑定将聚合当前属性值以达成共识(并且在存在多个值时不显示任何内容)。我最感兴趣的设置是颜色,但如果有一个至少有点通用的解决方案会很好。

【问题讨论】:

  • 你能用一个多值转换器吗?仍然会有点棘手,但它可以根据接收到的Values 数组的长度返回null
  • 我是否理解正确,您希望基本上选择多个并将所有颜色(和其他属性)一次更改为相同的值?
  • 看来你应该在 ViewModel 级别实现这样的逻辑,并在 UI 端使用简单的ItemsControl 来实现类似 PropertyGrid 的 UI。
  • @PseudoNym01 没错。
  • @BradleyDotNET 可能,虽然我不确定我到底是怎么看的。

标签: c# wpf


【解决方案1】:

源绑定将聚合当前的属性值 共识

创建一个名为 XYZ 的新属性,它聚合其他属性并在 Xaml 中绑定到它。除非绑定了其他聚合属性,否则您不必为它们调用 Notify Property Changed,但您将在它们中调用OnPropertyChanged("XYZ")

因此,聚合中的任何更改都会冒泡到新属性,并且它的 notify 属性更改会冒泡到 Xaml。为颜色/可见性/启用等添加具有类似过程的其他属性。

例如,请参阅我对MVVM update of calculated properties 的回答。

【讨论】:

  • 这似乎对于在单个对象中聚合属性很有用。不幸的是,我需要跨多个对象聚合属性。
  • @Jeff 无论是它的变量还是对象,最终结果是一个颜色还是一个可见度标志;您可能需要多个新属性,但最终它是一个简单的状态机。我可能不明白你需要聚合什么,但我以前用过这个 smurf Xaml 的相关数据。
  • @Jeff 为什么不在你的对象上创建一个部分(如果它是一个不是由你的代码创建的实体)或添加到执行我建议的当前类?因此使它跨越对象?
【解决方案2】:

我个人对此的解决方案是建立一个选择列表,尽管这假设屏幕上的所有对象都是同一类型。然后,一旦对象选择完成并更改了属性,它将触发一个事件,该事件循环遍历列表并将属性更新为选定的属性。这有点低效,因为它每次都会迭代每个属性,但我认为随之而来的“自动”缩放将有助于平衡必须编写额外代码。

这里有一些伪代码可以更清楚地说明我在说什么:

  1. 项目被单击/选择,添加到 SelectedList,执行 n 次
  2. 更改属性/属性
  3. 点击应用按钮,或类似的东西
  4. SelectedList 中的 Foreach 对象将每个属性设置为选定属性
  5. 完成

此方法适用于我上面提到的任意数量的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多