我正在使用此 UserControl 开发 WPF 应用程序:
public partial class MyUserControl : UserControl
{
public GridLength IconColumnWidth
{
get { return (GridLength)GetValue(IconColumnWidthProperty); }
set { SetValue(IconColumnWidthProperty, value); }
}
public static readonly DependencyProperty IconColumnWidthProperty =
DependencyProperty.Register(nameof(IconColumnWidth), typeof(GridLength), typeof(MyUserControl), new PropertyMetadata(new GridLength(0), new PropertyChangedCallback(SetIconColumnWidth)));
public static void SetIconColumnWidth(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyUserControl target = (MyUserControl)d;
target.MainGrid.ColumnDefinitions[0].Width = ((GridLength)e.NewValue);
}
}
我正在尝试按如下方式使用它:
<MyUserControl x:Name="Total" Value="{Binding TotalCycles, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" IconColumnWidth="50" />
但是,我收到错误“TypeConverter 无法从 System.String 转换”。
我尝试将此属性应用于我的 DependencyProperty 字段
[TypeConverter(typeof(GridLengthConverter))]
但什么都没有改变。 我做错了什么?
我终于找到了解决我的问题的方法。不确定这是否是正确的方法,但由于它工作正常且非常简单,因此我将我的解决方案发布为已接受的答案。如果有人能提供更好的解决方案来解释其优点,我将很乐意更新这篇文章(并最终更改接受的答案)。
我尝试了多种方法,例如仅在属性上、仅在依赖属性字段上或在两者上设置属性
[TypeConverter(typeof(GridLengthConverter))]
- 无法使其正常工作。
然后,我尝试编写 GridLengthConverter 的自定义实现并将其应用为属性,就像之前所做的那样。这开始工作,但它笨重且不可靠(每次我从 xaml 更改属性值时,我都会再次收到错误;重建项目有效,但这不允许我在应用程序运行时更改属性值 - 这应该是WPF 上的预期行为)。
最后,我简单地更改了在 XAML 中指定属性值的方式,最终得到以下结果:
<local:MyUserControl
Margin="20"
IconColumnWidth="{Binding Source=50}" />
我只是添加了一个 {Binding Source=myValue} ,我需要在其中指定该属性的值,使“myValue”等于所需的值。 即使没有指定 TypeConverter(因此我删除了自定义转换器),此语法也可以完美运行,并且还可以识别我是否指定了 Pixel GridLength 或 Star GridLength(比例值,如“0.5*”)。
我希望这能帮助其他遇到同样问题的人。
更新
从EldHasp的评论克隆源代码后,我尝试了一下,发现即使是一个干净的解决方案(不会给其他人带来任何错误),它也会给我带来同样的问题。
此时,我认为这是与我的 Visual Studio 安装有关的问题。我会尝试卸载并重新安装它,很快我就会有一个“无代码”的日子(不知道什么时候会发生......)