通过ElementName将UserControl属性绑定到其子项会导致绑定错误

Vit*_*lyB 7 .net wpf xaml

我有以下XAML:

<UserControl x:Class="WpfWindow.MyControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">
  <UserControl.RenderTransform>
    <TranslateTransform X="{Binding ElementName=MySlider, Path=ActualWidth}" />
  </UserControl.RenderTransform>
  <Grid>
    <Slider x:Name="MySlider" Canvas.Left="41" Canvas.Top="86" Height="23"  Width="100" Minimum="0" Maximum="100"/> 
  </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用带有UserControl的窗口时,我得到:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=MySlider'. BindingExpression:Path=ActualWidth; DataItem=null; target element is 'TranslateTransform' (HashCode=53368240); target property is 'X' (type 'Double')
Run Code Online (Sandbox Code Playgroud)

特别奇怪,因为直接在Window中使用相同的代码可以完美地工作.

现在我通过在代码中设置绑定来解决问题,但是,我不知道为什么我的版本不起作用,如果可能的话,我宁愿在XAML中拥有所有内容.

谢谢!

Fre*_*lad 8

我注意到有时候在Window/ UserControl等上设置带有ElementName的Bindings时,声明的顺序很重要.我不确定这个的原因,但是如果你Grid在设定之前宣布<UserControl.RenderTransform>它,我认为它会起作用

<UserControl ...>
    <Grid Background="Red">
        <Slider x:Name="MySlider" Canvas.Left="41" Canvas.Top="86" Height="23"  Width="100" Minimum="0" Maximum="100"/>
    </Grid>
    <UserControl.RenderTransform>
        <TranslateTransform X="{Binding ElementName=MySlider, Path=ActualWidth}" />
    </UserControl.RenderTransform>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

  • 我也遇到了这个问题但关于附属物.如果附加属性的目标位于根元素上,则需要将XAML扩展为元素而不是属性.示例:[link](http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/78540874-ebde-43bb-99bd-002c0cf44308#eacbab17-62fb-4048-9103-1dcb3581fe40) (2认同)