[英]UWP/WinUI3 Binding by ElementName inside UserControl custom Content DependencyProperty
[英]How to implement a WinUI 3 UserControl with ComboBox, Enum and DependencyProperty
假设我们有
public enum MyEnum {None, First, Second}
在MainWindow.xaml.cs
中,我们有
private IList<MyEnum> _myEnums = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList();
public IList<MyEnum> MyEnums => _myEnums;
public MyEnum SelectedMyEnum {get;set;}
在MainWindow.xaml
我们有
<StackPanel>
<ComboBox ItemsSource="{x:Bind MyEnums}" SelectedItem="{x:Bind SelectedMyEnum, Mode=TwoWay}"/>
</StackPanel>
正如预期的那样,这有效。
现在假设我们想用一个用户控件替换ComboBox
,即
<local:ExampleControl MyEnums="{x:Bind MyEnums}" SelectedMyEnum="{x:Bind SelectedMyEnum, Mode=TwoWay}"/>
所以,在ExampleControl.xaml
我们有
<StackPanel>
<ComboBox
ItemsSource="{x:Bind MyEnums}"
SelectedItem="{x:Bind SelectedMyEnum,Mode=TwoWay}">
</ComboBox>
</StackPanel>
在ExampleControl.xaml.cs
我们有
// SelectedMyEnum
public static readonly DependencyProperty SelectedMyEnumProperty =
DependencyProperty.Register(
"SelectedMyEnum",
typeof(MyEnum),
typeof(ExampleControl),
new PropertyMetadata(MyEnum.None)); // (1)
public MyEnum SelectedMyEnum
{
get { return (MyEnum)GetValue(SelectedMyEnumProperty); }
set { SetValue(SelectedMyEnumProperty, value); } // (2)
}
// MyEnums
public static readonly DependencyProperty MyEnumsProperty =
DependencyProperty.Register(
"MyEnums",
typeof(IEnumerable<MyEnum>),
typeof(ExampleControl), null
);
public IEnumerable<MyEnum> MyEnums
{
get { return (IEnumerable<MyEnum>)GetValue(MyEnumsProperty); }
set { SetValue(MyEnumsProperty, value); }
}
但这不起作用。 启动时, SelectedMyEnum
设置器 (2) 被重复调用,值为MyEnum.None
直到堆栈溢出,
System.StackOverflowException
HResult=0x800703E9
Source=<Cannot evaluate the exception source>
StackTrace:
<Cannot evaluate the exception stack trace>
我试过而不是(1)中的new PropertyMetadata(MyEnum.None)
new PropertyMetadata(MyEnum.None, OnEnumChanged)
和
private static void OnEnumChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
var control = (ExampleControl)obj;
MyEnum myVal = (MyEnum)args.NewValue;
}
但这没有什么区别,函数OnEnumChanged
与 setter 一起被重复调用,使用myVal == MyEnum.None
,直到堆栈溢出。
我在WinUI 库中查看了枚举的依赖属性示例,但找不到任何示例,但有很多关于 double、int 和 bool 的示例,例如WrapPanel 中的 ItemHeight ,我认为我做对了。
我一定错过了什么,但看不到它。 我搜索了ComboBox
、 DependencyProperty
、 Enum
,并找到了一些匹配项,例如Enum 作为 UserControl 的 DependencyProperty ,但我没有发现它们有帮助。 任何帮助表示赞赏。
环境:
Microsoft Visual Studio Community 2022
Version 17.1.0
VisualStudio.17.Release/17.1.0+32210.238
Microsoft .NET Framework
Version 4.8.04161
Roy Li - Microsoft Q&A 网站上的 MSFT 在此回答。 它与x:Bind
标记扩展中的 WinUI 缺陷有关。 在用户控件中,对于enums
, x:Bind
不适用于SelectedMyEnum
,它需要使用Binding
编写为
<ComboBox
ItemsSource="{x:Bind MyEnums}"
SelectedItem="{Binding SelectedMyEnum,Mode=TwoWay}">
</ComboBox>
并将DataContext
设置为this
。 在我的实验中,这似乎只是x:Bind
和TwoWay
绑定的问题, OneWay
和OneTime
与x:Bind
的绑定似乎没问题。 如果绑定到字符串而不是枚举,这不是问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.