gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:24:35 26 4
gpt4 key购买 nike

documentation对于 {X:bind} 提到可以在属性路径中进行转换(提到 {x:Bind obj.(TextBox.Text)})作为例子。在下面的简单示例中,我看不到这应该如何工作。我在括号中尝试了各种类型名称的组合,但没有成功。

一个常见的用例是组合框的双向绑定(bind),在这里我会将 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();
}
}
}

最佳答案

目前,现有的语法不可能做到这一点。这很糟糕,因为它向绑定(bind)表达式添加了不必要的重复代码:要在这种情况下使用 {x:Bind},必须指定一个转换器,即使它什么都不做。

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

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

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

其他来源:

NoOpConverter.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;

}
}

App.xaml 中注册转换器:

<Application
x:Class="XBindTest4.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XBindTest4"
RequestedTheme="Light">

<Application.Resources>
<ResourceDictionary>
<local:NoOpConverter x:Key="NoOpConverter"/>
</ResourceDictionary>
</Application.Resources>

</Application>

MainPage.xaml.cs:

<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, Converter={StaticResource NoOpConverter}}"/>
</StackPanel>
</Page>

关于c# - 如何在 {x :bind}? 中转换依赖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com