【问题标题】:Multibinding WPF多绑定 WPF
【发布时间】:2014-06-12 13:31:56
【问题描述】:

我正在根据画布的位置在画布中安排几个文本块。示例代码 sn-p 在底部提供。对于这个过程,我需要访问 ItemContainerStyle 中每个文本块的实际宽度和实际高度。我正在努力按元素名称访问它的属性,如下所示,因为它没有名称。怎么做?我需要通过模板吗?

<MultiBinding Converter="{StaticResource BPositionConverter}" ConverterParameter="Left">                            
     <Binding ElementName="TextBlock" Path="ActualHeight" />  <---Problem
     <Binding ElementName="TextBlock"  Path="ActualWidth" />  <---Problem
</MultiBinding>

--完整的sn-p

<ItemsControl ItemsSource="{Binding Locations}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="Point">
            <TextBlock Text="{Binding}" Width="40" Height="20" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>  
        <Style TargetType="ContentPresenter">  
            <Setter Property="Canvas.Left">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource BPositionConverter}" ConverterParameter="Left">                            
                        <Binding ElementName="TextBlock" Path="ActualHeight" />  <---Problem
                        <Binding ElementName="TextBlock"  Path="ActualWidth" />  <---Problem
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

【问题讨论】:

  • 您能告诉我们您要达到的目标吗?似乎您想操作 Canvas.Left,所以想知道 BPositionConverter 对 ActualHeight 和 ActualWidth 做了什么。可能有另一种方法而不指定文本块的名称
  • @pushpraj,请检查这个问题。它说所有stackoverflow.com/questions/23000804/…实际上是用于根据参考点在画布中设置textpox位置,我仍然需要向多绑定转换器添加更多参数

标签: wpf wpf-controls


【解决方案1】:

由于您的数据模板由单个文本元素组成,您可以参考 self 来获取相同的实际宽度和高度

所以删除 ElementName 并应用 RelativeSource,应该可以使用这个技巧

<Style TargetType="ContentPresenter">
    <Setter Property="Canvas.Left">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource BPositionConverter}"
                          ConverterParameter="Left">
                <Binding Path="ActualHeight"
                         RelativeSource="{RelativeSource Self}" />
                <Binding Path="ActualWidth"
                         RelativeSource="{RelativeSource Self}" />
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

  • 哇,我没想到,我会的。如果有更多元素会发生什么?
  • 这将考虑数据模板中的整个布局,实际宽度或高度将相应响应,其他方法是使用模型中的属性并从文本块中推送值并以样式检索它们(如果只有文本块)需要。
  • 总是返回零,是什么原因?
  • 对于我使用上述数据模板进行的测试,它工作正常。您可能会检查输出窗口中是否有任何绑定或数据错误。您是否可以分享您相关代码的工作示例?至少需要 BPositionConverter 和数据模型(例如位置)。
猜你喜欢
  • 2010-11-13
  • 2013-04-04
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2011-05-08
  • 2011-04-01
相关资源
最近更新 更多