如何在{x:bind}中转换依赖项属性?

时间:2015-11-16 20:53:36

标签: c# winrt-xaml

{X:bind}的{​​{3}}提到可以在属性路径中进行投射(例如,提及{x:Bind obj.(TextBox.Text)})。在下面的简单示例中,我无法看到它应该如何工作。我在parens中尝试了各种类型名称组合,但没有成功。

一个常见的用例是组合框的双向绑定,这里我将SelectedValue属性从通用对象类型转换为更具体的类型。

示例xaml页面 MainPage.xaml

<Page
    x:Class="XBindTest4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XBindTest4"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" >

    <StackPanel>
        <ComboBox ItemsSource="{x:Bind SampleList, Mode=OneWay}" 
                  SelectedValue="{x:Bind SampleData, Mode=TwoWay}"/>
    </StackPanel>

</Page>

MainPage.xaml.cs 后面的代码:

using System.Collections.ObjectModel;
using Windows.UI.Xaml.Controls;

namespace XBindTest4 {

    public class SampleClass {
    }

    public sealed partial class MainPage : Page {

        public ObservableCollection<SampleClass> SampleList = new ObservableCollection<SampleClass>(new[] {
            new SampleClass(),
            new SampleClass()
            });

        public SampleClass SampleData { get; set; }

        public MainPage() {
            this.InitializeComponent();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

目前,现有的语法可能性无法做到这一点。这很糟糕,因为它为绑定表达式添加了不必要的重复代码:在这种情况下使用<button class="navbutton" onclick="window.location='addevent.aspx';">Add Event</button> ,必须指定转换器,即使它什么都不做。

TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tel.getNetworkOperator();

if (networkOperator != null) {
    int mcc = Integer.parseInt(networkOperator.substring(0, 3));
    int mnc = Integer.parseInt(networkOperator.substring(3));
}

如果使用转换器,则将适当的强制转换插入到生成的文件 MainPage.g.cs 中:

{x:Bind}

其他来源:

NoOpConverter.cs

...
SelectedValue="{x:Bind SampleData, Mode=TwoWay, Converter={StaticResource NoOpConverter}}
...

App.xaml 中注册转换器:

this.dataRoot.SampleData = (global::XBindTest4.SampleClass)this.LookupConverter("NoOpConverter").ConvertBack((this.obj2).SelectedValue, typeof(global::XBindTest4.SampleClass), null, null);

MainPage.xaml.cs中

using System;
using Windows.UI.Xaml.Data;

namespace XBindTest4 {

    public class NoOpConverter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, string language)
            => value;

        public object ConvertBack(object value, Type targetType, object parameter, string language)
            => value;

    }
}