代码中的WPF绑定无法进行转换

时间:2009-12-31 00:12:04

标签: wpf xaml binding code-behind

显示一个矩形并将Width,Height,Angle绑定到视图模型类,就像我在XAML中所期望的一样

<Rectangle 
  RenderTransformOrigin="0.5,0.5" 
  Fill="Black" 
  Width="{Binding Path=Width, Mode=TwoWay}" 
  Height="{Binding Path=Height, Mode=TwoWay}">
  <Rectangle.RenderTransform>
    <RotateTransform Angle="{Binding Path=Angle, Mode=TwoWay}" />
  </Rectangle.RenderTransform>
</Rectangle>

但是,在代码隐藏中创建矩形时,我可以绑定到高度和宽度,但不能绑定角度。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
  Binding bindH = new Binding("Height");
  bindH.Mode = BindingMode.TwoWay;

  Binding bindW = new Binding("Width");
  bindW.Mode = BindingMode.TwoWay;

  // DOES NOT WORK
  // AND I DID TRY MANY OTHER COMBINATIONS
  Binding bindA = new Binding("Angle");
  bindA.Mode = BindingMode.TwoWay;

  Rectangle r1 = new Rectangle();
  SolidColorBrush myBrush = new SolidColorBrush(Colors.Black);
  r1.Fill = myBrush;
  r1.RenderTransformOrigin = new Point(0.5,0.5);
  r1.SetBinding(Rectangle.WidthProperty, bindW);
  r1.SetBinding(Rectangle.HeightProperty, bindH);

** //不起作用**

  r1.SetBinding(RenderTransformProperty, bindA);

  LayoutPanel.Children.Add(r1);                     // my custom layout panel
}

所有帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

ViewModel中的Angle属性必须作为RotateTransform公开。虚拟机的简单实现如下所示:

public class ViewModel
{
    public RotateTransform Angle { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }

    public ViewModel()
    {
        Angle = new RotateTransform(10);
        Height = 50;
        Width = 100;
    }
}

然后绑定的工作方式与在Window_Loaded事件处理程序中编写完全相同。这是有道理的,因为在工作的XAML版本中,您在Rectangle的RenderTransform标记中以声明方式指定RotateTransform对象。

希望这会有所帮助:)

答案 1 :(得分:0)

您在矩形上设置角度,但您必须在RotateTransform上设置角度。

试试这个,

RotateTransform rot = new RotateTransform();
r1.RenderTransform = rot;
rot.SetBinding(RotateTransform.AngleProperty, bindA);

答案 2 :(得分:0)

使用Binding调用RotateTransform的SetValue方法不起作用。不知道为什么。但是通过BindingOperations可以工作。

 var rotateTransform = new RotateTransform();
 BindingOperations.SetBinding(rotateTransform, RotateTransform.AngleProperty, new Binding("RotationAngle") { Source = myViewModel });
 myControl.RenderTransform = rotateTransform;

其中“RotationAngle”是ViewModel中的double属性。

仅供参考,XAML的绑定似乎最终有效。我首先得到了几个Binding错误然后它可以工作......是的,我的DataContext在创建RotateTransform的对象之前就已经存在了。为了避免Binding错误,我使用了代码隐藏并在Loaded事件期间设置了Binding。