【发布时间】: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中使用的相同模板绑定到装饰器。 -
确实是彼得,但我经常因为提供“太多信息”而被否决,所以我一直试图弄清楚有多少是“足够”的。我想说这里越多越好,但我和任何人一样关心可见度。