UserControl Canvas.Left绑定不起作用

时间:2012-12-28 23:27:36

标签: wpf binding canvas user-controls

所以问题是这个。我需要UserControl,它将设置Canvas.Top和Canvas.Left,但这些属性是从ViewModel绑定的。为简单起见,让我们为用户控件提供此代码,后面没有代码:

<UserControl x:Class="BadBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Canvas.Left="{Binding ElementName=slider, Path=Value}"
         >
 <Grid Width="100" Background="Red">
    <Slider x:Name="slider" Minimum="100" Maximum="250" />
 </Grid>
</UserControl>

主窗口的代码:

<Window x:Class="BadBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:local="clr-namespace:BadBinding"
    >
  <Canvas>
    <local:MyUserControl />
  </Canvas>
</Window>

我不知道为什么绑定不起作用。当您将Canvas.Left直​​接设置为某个值时,一切正常,并将用户控件的内容直接写入主窗口。

2 个答案:

答案 0 :(得分:2)

我认为是因为构建UserControl是为了加入Canvas,而Canvas.Left是附加属性,它可能无法正确解析。

尝试使用Reference绑定。

<UserControl x:Class="BadBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Canvas.Left="{Binding Source={x:Reference Name=slider}, Path=Value}"
         >
 <Grid Width="100" Background="Red">
    <Slider x:Name="slider" Minimum="100" Maximum="250" />
 </Grid>
</UserControl>

注意:您可能会收到编译警告,但仍会编译。

但我认为最好的选择是在你的usercontrol上创建一个属性来绑定值,这也可以。

答案 1 :(得分:0)

我用Bindings做了很多尝试,但它也适用于我..所以如果你想和EventHandler一起使用,那么下面的解决方法可能对你有帮助..

删除Bindings并向ValueChanged事件

添加事件处理程序

MyUserControl.xaml

<UserControl x:Class="BadBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <Grid Width="100" Background="Red">
    <Slider x:Name="slider" Minimum="100" Maximum="250" ValueChanged="slider1_ValueChanged" />
 </Grid>
</UserControl>

MyUserControl.xaml.cs

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
     Canvas.SetLeft(this, slider1.Value);            
}   

如果你发现任何问题,我试过这个并为我工作然后告诉我..