2016-05-06 2 views
1

я сделал «MVVM выпадающий», основанный на этом посту: https://marcominerva.wordpress.com/2015/01/15/how-to-open-and-close-flyouts-in-universal-apps-using-mvvm/Использования х: Bind с вложенным свойством (показывая выпадающий)

Он работает хорошо. Но это не работает с скомпилированного связывания (х: Bind)

Это:

<Flyout local:FlyoutHelpers.Parent="{x:Bind ShowButton}"... 

INSEAD этого:

<Flyout local:FlyoutHelpers.Parent="{Binding ElementName=ShowButton}"... 

бросает странные ошибки при строительстве:

Error CS1503 Argument 1: cannot convert from 'Windows.UI.Xaml.Controls.Flyout' to 'Windows.UI.Xaml.FrameworkElement'

Есть ли какой-либо вариант использования x: Bind?

+0

X: Привязка не принимает ElementName. Поэтому вы не можете использовать в этом случае – Archana

+0

Я уверен, что это так. https://msdn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension (10-й абзац в разделе «Путь свойств»). – Alamakanambra

+0

Да, да. Извините, я не понял. Я знал, что опции ElementName не существует. Но не знал, что вы можете указать его как путь. – Archana

ответ

5

Проблема связана с созданным кодом для {x:Bind}.

Как известно, {x:Bind} использует сгенерированный код для достижения своих преимуществ. И эти коды можно найти в OBJ папки с такими именами, как (на C#) < вид имени > .g.cs. Для получения дополнительной информации см. {x:Bind} markup exstrong texttension.

Если вы идете в .g.cs файл (я использовал FlyoutHelper в MainPage, так что в моей стороне, это MainPage.g.cs), вы найдете ошибки в Set_FlyoutDemoSample_FlyoutHelper_Parent способ. Этот метод генерируется во время компиляции, FlyoutDemoSample - это пространство имен моего проекта. Его имя может отличаться в вашей стороне. enter image description here

Если мы перейдем к определению этого метода, мы найдем тип первого параметра в этом методе: FrameworkElement.

public static void Set_FlyoutDemoSample_FlyoutHelper_Parent(global::Windows.UI.Xaml.FrameworkElement obj, global::Windows.UI.Xaml.FrameworkElement value, string targetNullValue) 
{ 
    if (value == null && targetNullValue != null) 
    { 
        value = (global::Windows.UI.Xaml.FrameworkElement) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.FrameworkElement), targetNullValue); 
    } 
    global::FlyoutDemoSample.FlyoutHelper.SetParent(obj, value); 
} 

Однако при использовании FlyoutHelper параметр мы устанавливаем здесь является Flyout. enter image description here Flyout класс не является производным от FrameworkElement. Поэтому он выдает ошибку: cannot convert from 'Windows.UI.Xaml.Controls.Flyout' to 'Windows.UI.Xaml.FrameworkElement'. Если мы изменим тип первого параметра на DependencyObject, все коды будут работать хорошо.

public static void Set_FlyoutDemoSample_FlyoutHelper_Parent(global::Windows.UI.Xaml.DependencyObject obj, global::Windows.UI.Xaml.FrameworkElement value, string targetNullValue) 
{ 
    if (value == null && targetNullValue != null) 
    { 
        value = (global::Windows.UI.Xaml.FrameworkElement) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.FrameworkElement), targetNullValue); 
    } 
    global::FlyoutDemoSample.FlyoutHelper.SetParent(obj, value); 
} 

Однако эти коды генерируются автоматически, если восстановить этот проект, мы все еще получаю ту же ошибку. Я не уверен, что это потенциальная ошибка в UWP, но я думаю, что мы ничего не можем сделать, чтобы исправить это. Поэтому я предлагаю вам по-прежнему использовать Binding в этом специальном сценарии.

+0

Было бы замечательно, если бы Microsoft сделала эту работу, как вы упомянули. – bunkerdive

Смежные вопросы