代码之家  ›  专栏  ›  技术社区  ›  Zamboni

代码隐藏中的wpf绑定转换失败

  •  0
  • Zamboni  · 技术社区  · 15 年前

    显示矩形并将宽度、高度、角度绑定到视图模型类的工作方式与我在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 回复  |  直到 11 年前
        1
  •  1
  •   kiwipom    15 年前

    ViewModel中的Angle属性必须公开为RotateTransform。vm的一个小实现如下所示:

    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;
        }
    }
    

    然后,绑定的工作方式与您在窗口加载的事件处理程序中编写的完全相同。这很有意义,因为在工作的xaml版本中,您可以在矩形的rendertransform标记中声明性地指定rotatetransform对象。

    希望这有帮助:)

        2
  •  0
  •   Akash Kava    15 年前

    您正在矩形上设置角度,但必须在旋转平移上设置角度。

    试试这个,

    RotateTransform rot = new RotateTransform();
    r1.RenderTransform = rot;
    rot.SetBinding(RotateTransform.AngleProperty, bindA);
    
        3
  •  0
  •   JimSt24    11 年前

    使用绑定调用RotateTransform的SetValue方法不起作用。不知道为什么。但是通过绑定操作是可行的。

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

    其中“rotationangle”是viewmodel中的一个double属性。

    仅供参考,从xaml绑定似乎最终会起作用。一开始我会遇到一些绑定错误,然后它就开始工作了……是的,在创建带有rotatetransform的对象之前,我的datacontext就已经就位了。为了避免绑定错误,我使用代码隐藏并在加载事件期间设置绑定。