2016-10-15 3 views
3

Мне нужно сохранить позицию элемента UI переменной. Я поставил x и y в моей коллекции и связать егоНевозможно установить режим TwoWay на x: Bind

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

и моя «модель»

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

И изменить его на странице путем перемещения и попытаться обновить их в коллекции Но если я устанавливаю Mode=TwoWay у меня есть компилировать ошибку

Тяжесть Код Описание файла проекта линия SUP прижимной государственная Ошибка CS1061 «Сетка» не содержит определение для «Top» и не метода расширения «Top» принимающий первый аргумент типа «Сетку» может быть найден

+0

Не могли бы вы поделиться [mcve], который может воспроизвести вашу проблему? –

+1

@ JayZuo-MSFT да, я сделал – SmiLe

+0

Я протестировал с кодом, который вы опубликовали, в моей стороне нет ошибки компилятора. Возможно, проблема не в том коде, который вы опубликовали. Вы можете попробовать с кодом в новом проекте Blank App. Если у вас все еще есть проблемы, пожалуйста, поделитесь [mcve]. –

ответ

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

obj2 является Grid, он не содержит свойство с именем Left или Top, поэтому мы 'Получают ошибки компилятора.

Чтобы устранить эту проблему, минимальная целевая версия SDK для приложения должна быть 14393 или новее. Чтобы изменить версию Minimum и Target для проекта, который уже был создан в Visual Studio, перейдите к Проект → Свойства → вкладка Приложения → Таргетинг. enter image description here

После этого, мы можем Rebuild проект, то не должно быть никаких ошибок компилятора. Связывание должно быть сгенерировано правильно.

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); 
     } 
    }); 
Смежные вопросы