【问题标题】:Passing ActualWidth and ActualHeight into a MultiBinding将 ActualWidth 和 ActualHeight 传递给 MultiBinding
【发布时间】:2017-07-04 19:00:57
【问题描述】:

我有一个 WPF 项目(c#,使用 MVVM Light 的 MVVM),我有一个 MultiBinding,可以将信息传递给转换器,正如您所期望的那样。

代码在这里:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Path Stroke = "{Binding LineColour}" >
                < Path.Data >
                    < MultiBinding Converter="{StaticResource NodeToPathDataConverter}">
                        <Binding Path = "NodeListViewModel.NodeList" Source="{StaticResource Locator}" />
                        <Binding />
                    </MultiBinding>
                </Path.Data>
            </Path>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

然后转换器使用来自这些绑定的信息来输出该行的详细信息。问题是该线从一个控件的 (0,0) 位置到另一个,但我希望它从相关控件的中间开始。为此,MultiBinding 中的转换器需要获取相关控件的 ActualWidth 和 ActualHeight。

那么有问题的控件是什么?我在这个下面有另一个几乎相同的 ListBox 控件,它使用相同的数据集,但不是在控件之间绘制线条,而是绘制控件本身。如下:

<ListBox.ItemTemplate>
    <DataTemplate>
            <Grid>
                <Thumb Name = "myThumb" Template="{StaticResource NodeVisualTemplate}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName = "DragDelta" >
                                < cmd:EventToCommand Command = "{Binding NodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Thumb>
            </Grid>
        </DataTemplate>
</ListBox.ItemTemplate>

我使用两个 ListBox 控件的原因是为了确保所有行都低于所有 Thumbs。我在同一个 ListBox 中尝试了很多方法,但它不会发生。它们确实共享相同的数据集,即“NodeList”。

所以我想不通的是如何将第二个 ListBox 中 Thumbs 的 ActualWidth 和 ActualHeight 放入第一个 ListBox 中的转换器中。这就是我在这里的原因。

任何帮助将不胜感激。

【问题讨论】:

  • 以某种方式将拇指放在其坐标原点的中心可能会更简单,例如通过将它们放在一个足够大的网格中,该网格具有固定大小和固定(大小的一半)负边距。
  • 太宽泛了,尤其是在没有更多上下文的情况下(比如好的minimal reproducible example)。也就是说,为了解决您的字面问题,如果两个 ListBox.ItemsSource 集合都绑定到同一个源,那么您的视图模型可以通过将 Mode=OneWayToSource 绑定到第二个列表框中的 Actual... 属性和 Mode=OneWay 来进行调解在第一个。请注意,这里可能更好的方法是不使用第一个ListBox,而是将图形放在装饰层中。您应该能够从与第二个ListBox 中使用的相同模板绑定到装饰器。
  • 确实是彼得,但我经常因为提供“太多信息”而被否决,所以我一直试图弄清楚有多少是“足够”的。我想说这里越多越好,但我和任何人一样关心可见度。

标签: c# wpf mvvm listbox


【解决方案1】:

您可以使用此处提到的任何解决方法将第二个ListViewThumbActualWidthActualHeight 只读属性“绑定”到数据对象的某些double 源属性:

Bind to ActualHeight of Item ItemsControl

然后您可以绑定到第一个ListViewItemTemplate 中的相同源属性。如果ListViews 绑定到同一个源集合,这应该可以工作。

虽然使用纯 XAML 无法直接绑定到第二个 ListView 中的实际 Thumb 元素。

【讨论】:

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