所以问题是这个。我需要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直接设置为某个值时,一切正常,并将用户控件的内容直接写入主窗口。
答案 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);
}
如果你发现任何问题,我试过这个并为我工作然后告诉我..