我在WinUI 3桌面应用程序中有一个名为HomePage
的Page
。HomePage
有两个DependencyProperties
、P1
和P2
。我希望创建一个绑定,该绑定使用P1
作为源,使用P2
作为目标(假设P1
和P2
是相同的类型)。这可以很容易地在代码中完成,但是,我可以在XAML中创建绑定吗?
下面是绑定的代码:
public sealed partial class HomePage : Page
{
public HomePage()
{
InitializeComponent();
// Dependency property identifiers are static public fields. This is the identifier of the Target.
var targetInfo = typeof(HomePage).GetField("P2Property", BindingFlags.Static | BindingFlags.Public);
if (targetInfo is not null && targetInfo.FieldType == typeof(DependencyProperty))
{
Binding bBinding = new() { Path = new PropertyPath("P1"), Source=this, Mode = BindingMode.OneWay };
// this is a static field (there are no instance versions) and the value is the identifier of the DependencyProperty
var dp = (DependencyProperty)targetInfo.GetValue(null);
ClearValue(dp);
SetBinding(dp, bBinding); // create the binding
}
}
// P1
public static readonly DependencyProperty P1Property = DependencyProperty.Register(
"P1", typeof(object), typeof(HomePage), new PropertyMetadata(null));
public object P1
{
get => (object)GetValue(P1Property);
set => SetValue(P1Property, value);
}
// P2
public static readonly DependencyProperty P2Property = DependencyProperty.Register(
"P2", typeof(object), typeof(HomePage), new PropertyMetadata(null));
public object P2
{
get => (object)GetValue(P2Property);
set => SetValue(P2Property, value);
}
}
是否可以改为在XAML中创建绑定(bBinding
)?
[编辑]感谢您的回答,我已经尝试过了,但问题仍然存在。以下是HomePage的XAML:
<Page
x:Class="PFSI.Views.HomePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="using:PFSI.Views"
x:Name="homePage">
<Grid>
<!-- Blah -->
</Grid>
</Page>
定义绑定不是问题-以下任何一项都可以:P2="{Binding P1, ElementName=homePage}"
; P2="{Binding RelativeSource={RelativeSource Self}, Path=P1}"
; DataContext
被设置为HomeViewModel
,但这在这里并不重要。
我尝试使用建议的<views:HomePage ... />
,但结果是堆栈溢出,因为编译器在元素和类之间循环。
我认为Style
可能会起作用(类似于:
<Setter Property="P2" Value="{Binding RelativeSource={RelativeSource Self}, Path=P1}"/>
),但是WinUI 3 Styles
中的Setters
不支持绑定(尽管奇怪的是,绑定在VisualStateManager
Setters
中工作)。
我确信这在XAML中应该可以工作--也许它只需要等待Setter
Binding
的支持?
2条答案
按热度按时间nkoocmlb1#
这种绑定就是所谓的自绑定,用于绑定到标记自身的属性或标记自身属性之间的绑定。
1 -自绑定
通过在
Path
属性中指定标记的属性,使用RelativeSourceMode.Self
访问标记的属性几乎与Andrew的回答相似(显式模式规范):
2 -元素名称
如果布局包含多个相同类型(或self)的元素,也可以尝试通过
ElementName
绑定:更多
探索更多关于
RelativeSource
和Binding
标记扩展的信息,深入了解它,因为它在你以后的项目中使用起来真的很方便。顺便看看@james.lee detailed answer关于这个主题。cig3rfwq2#
你可以这样做。
主窗口.xaml
主页.xaml
主页.xaml.cs