gpt4 book ai didi

c# - 如何绑定(bind)到 UWP 中的附加属性?

转载 作者:太空狗 更新时间:2023-10-29 23:13:31 25 4
gpt4 key购买 nike

我需要将控件的属性绑定(bind)到 XAML 中的附加属性(以便附加属性成为绑定(bind)的源),但我不知道该怎么做——VS2015 给了我“< strong>Value does not fall in the expected range”错误,当我运行应用程序时,出现异常。

下面显示的技术在 WPF 中非常有效。

这是演示问题的示例应用。

AttachedPropertyTest.cs:

namespace App7
{
public static class AttachedPropertyTest
{
public static readonly DependencyProperty FooProperty = DependencyProperty.RegisterAttached(
"Foo", typeof(string), typeof(AttachedPropertyTest), new PropertyMetadata("Hello world!"));

public static void SetFoo(DependencyObject element, string value)
{
element.SetValue(FooProperty, value);
}

public static string GetFoo(DependencyObject element)
{
return (string) element.GetValue(FooProperty);
}
}
}

主页.xaml:

<!-- Based on the default MainPage.xaml template from VS2015.
The only thing added is the TextBlock inside the Grid. -->
<Page x:Class="App7.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App7"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{Binding Path=(local:AttachedPropertyTest.Foo), RelativeSource={RelativeSource Self}}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Page>

而不是显示“Hello world!” (这是 Foo 附加属性的默认值)在上面的 TextBlock 上,我得到了从 InitializeComponent 抛出的 XamlParseException。与往常一样,异常对象不包含任何有用的信息。

有趣的是,如果我尝试绑定(bind)到任何标准(内置于框架中)附加属性(如 (Grid.Row)),这不会发生,所以看起来 XAML 解析器只是不' 让我使用自定义附加属性提供程序,这太荒谬了......

那么正确的做法是什么?

最佳答案

尝试使用 x:Bind 声明而不是 Binding 声明。

<Grid>
<TextBlock Text="{x:Bind Path=(local:AttachedPropertyTest.Foo) }"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

但是,使用 x:Bind 的工作原理是生成代码以支持后台代码中的绑定(bind)。

经过一些试验,生成 XamlTypeInfo.g.cs 文件的工具似乎发生了问题,该文件是已声明的 Xaml 元素的编译查找,不幸的是 InitTypeTables() 中缺少 AttachedPropertyTest 注册方法。

一个有趣的article关于 XamlTypeInfo 类的生成描述了您的问题提出了一些建议,包括使用自定义 IXamlMetadataProvider

我发现以下更改也有效:

将 AttachedPropertyTest 类的声明从静态更改为并添加 Bindable属性,这将使生成 XamlTypeInfo 类的工具可以检测到它。

[Bindable]
public class AttachedPropertyTest
{
public static readonly DependencyProperty FooProperty =
DependencyProperty.RegisterAttached(
"Foo", typeof(string), typeof(AttachedPropertyTest), new PropertyMetadata("Hello world!"));

public static void SetFoo(DependencyObject element, string value)
{
element.SetValue(FooProperty, value);
}

public static string GetFoo(DependencyObject element)
{
return (string)element.GetValue(FooProperty);
}
}

然后修改 xaml 声明以包含 RelativeSource

    <TextBlock Text="{Binding Path=(local:AttachedPropertyTest.Foo), RelativeSource={RelativeSource Self}, Mode=OneWay}"
HorizontalAlignment="Center" VerticalAlignment="Center"
/>

关于c# - 如何绑定(bind)到 UWP 中的附加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701255/

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