WPF GridLength 依赖属性:无法从 System.String 转换

问题描述 投票:0回答:1

我正在使用此 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))]

但什么都没有改变。 我做错了什么?

wpf xaml .net-core dependency-properties typeconverter
1个回答
0
投票

我终于找到了解决我的问题的方法。不确定这是否是正确的方法,但由于它工作正常且非常简单,因此我将我的解决方案发布为已接受的答案。如果有人能提供更好的解决方案来解释其优点,我将很乐意更新这篇文章(并最终更改接受的答案)。

我尝试了多种方法,例如仅在属性上、仅在依赖属性字段上或在两者上设置属性

[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的评论克隆源代码后,我尝试了一下,发现即使是一个干净的解决方案(不会给其他人带来任何错误),它也会给我带来同样的问题。

Issue on clean solution

此时,我认为这是与我的 Visual Studio 安装有关的问题。我会尝试卸载并重新安装它,很快我就会有一个“无代码”的日子(不知道什么时候会发生......)

© www.soinside.com 2019 - 2024. All rights reserved.