【问题标题】:UserControl Canvas.Left binding doesnt workUserControl Canvas.Left 绑定不起作用
【发布时间】:2012-12-28 23:27:35
【问题描述】:

所以问题是这样的。我需要设置 Canvas.Top 和 Canvas.Left 的 UserControl,但这些属性是从 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 直接设置为某个值时,一切都很好,并且将用户控件的内容直接写入主窗口。

【问题讨论】:

    标签: wpf binding canvas user-controls


    【解决方案1】:

    我认为这是因为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>
    

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

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

    【讨论】:

    • 我可能会使用它作为解决方案,因为我不希望后面有任何代码。如果有人更深入地解释为什么这不起作用,我仍然会很高兴。
    • 我认为它的发生是因为即使在 Xaml 中创建控件然后将其添加到容器(Canvas)中,但由于 Canvas.Left/Right 属性是附加属性,当 UserControl 创建为那时它不在画布内,如果您在将控件添加到画布后应用绑定,那么它会正常工作。我不确定这是否是正确的解释,但根据我在过去几年中看到的情况,这是我最好的假设。
    • 是的,我同意你的观点,但我想知道为什么它无法解决以及为什么会这样做(作者想要这样做?因为......不可能?)。只是出于好奇。值得知道胆量:)
    • 你应该在 MSDN 上问这个问题,你可能会得到关于它为什么会这样行为的回应。
    【解决方案2】:

    我对@9​​87654321@ 进行了很多尝试,但它也对我有用。所以如果您想使用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);            
    }   
    

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

    【讨论】:

    • 感谢您的回答,但这应该是查看 MVVM 的一部分,没有后面的代码,所以我宁愿使用 {x:Reference} 并切换到这个,以防参考将停止工作。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2018-12-07
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多