无法将TwoWay模式设置为x:Bind

时间:2016-10-15 14:42:15

标签: c# xaml binding uwp windows-10-universal

我需要将UI元素的位置保存到变量。我将xy添加到我的收藏中并将其绑定

  <Canvas>
   <Grid
     Canvas.Top="{x:Bind PositionY, Mode=TwoWay}"
     Canvas.Left="{x:Bind PositionX, Mode=TwoWay}"

我的模特&#39;

public double PositionX {get;set;}
public double PositionY {get;set;}

我在页面上通过移动更改它,并尝试在集合中更新这些 但如果我设置Mode=TwoWay我已编译错误

  

严重级代码描述项目文件行抑制状态   错误CS1061&#39;网格&#39;不包含&#39; Top&#39;的定义和不   扩展方法&#39; Top&#39;接受类型&#39; Grid&#39;的第一个参数。可以   找到了

1 个答案:

答案 0 :(得分:1)

这是一个已在Windows 10 Anniversary Update SDK(14393)中修复的编译器问题。

众所周知, {x:Bind} 使用生成的代码来实现其优势。在XAML编译时,{x:Bind}将转换为代码,该代码将从数据源上的属性获取值,并将其设置在标记中指定的属性上。

当应用程序定位早于14393的版本时,它会生成如下代码以更新双向绑定:

this.obj2 = (global::Windows.UI.Xaml.Controls.Grid)target;
(this.obj2).RegisterPropertyChangedCallback(global::Windows.UI.Xaml.Controls.Canvas.LeftProperty,
    (global::Windows.UI.Xaml.DependencyObject sender, global::Windows.UI.Xaml.DependencyProperty prop) =>
    {
        if (this.initialized)
        {
            // Update Two Way binding
            this.dataRoot.PositionX = (this.obj2).Left;
        }
    });
(this.obj2).RegisterPropertyChangedCallback(global::Windows.UI.Xaml.Controls.Canvas.TopProperty,
    (global::Windows.UI.Xaml.DependencyObject sender, global::Windows.UI.Xaml.DependencyProperty prop) =>
    {
        if (this.initialized)
        {
            // Update Two Way binding
            this.dataRoot.PositionY = (this.obj2).Top;
        }
    });

obj2Grid,它不包含名为LeftTop的属性,因此我们会遇到编译错误。

要解决此问题,应用的最低目标SDK版本必须为14393或更高版本。要更改已在Visual Studio中创建的项目的最低版本和目标版本,请转到项目→属性→应用程序选项卡→定位enter image description here

在此之后,我们可以重建项目,然后应该没有编译器错误。应该正确生成绑定。

this.obj2 = (global::Windows.UI.Xaml.Controls.Grid)target;
(this.obj2).RegisterPropertyChangedCallback(global::Windows.UI.Xaml.Controls.Canvas.LeftProperty,
    (global::Windows.UI.Xaml.DependencyObject sender, global::Windows.UI.Xaml.DependencyProperty prop) =>
    {
        if (this.initialized)
        {
            // Update Two Way binding
            this.dataRoot.PositionX = global::Windows.UI.Xaml.Controls.Canvas.GetLeft(this.obj2);
        }
    });
(this.obj2).RegisterPropertyChangedCallback(global::Windows.UI.Xaml.Controls.Canvas.TopProperty,
    (global::Windows.UI.Xaml.DependencyObject sender, global::Windows.UI.Xaml.DependencyProperty prop) =>
    {
        if (this.initialized)
        {
            // Update Two Way binding
            this.dataRoot.PositionY = global::Windows.UI.Xaml.Controls.Canvas.GetTop(this.obj2);
        }
    });