我可以使用 XAML 中的强制转换对整数进行拆箱吗?

Can I unbox an integer with a cast in XAML?

我遇到过这样的情况,我有一个 class,return 类型 object 我碰巧知道它只是一个装箱的 int 值。我使用的控件可以绑定到 int 属性 或 double 属性 但它不能绑定到 [=48= 的对象]盒装intdouble。我必须解决这个限制。我想以一种非常简单的方式这样做。

编辑添加: 当我尝试这样做时发生的异常是 System.NotSupportedException 消息 DoubleConverter cannot convert from System.Int32

那么有没有一种方法可以在 XAML 中转换为 intdouble,这相当于拆箱操作?我已经知道如何在 XAML 中转换引用类型,因此我可以访问一些特定的派生-class 属性。但是我遇到了这个问题,因为 int 不是具有属性的类型。

下面是class(简化版)。它表示一组范围内的整数或双精度数,甚至是“最小”和“最大”值有意义的其他类型。所以它必须 return 它们都作为对象。无论如何,所有 3 个属性都将 return 盒装值中的相同基础类型,无论是 doubleint 还是其他。

public class Parameter
{
    virtual object Lower      { get; }     
    virtual object Upper      { get; }   
    virtual object Value      { get; set; } 
}

我是这样绑定控件的

<tk:RadNumericUpDown MinWidth="100"
    IsInteger="True"
    Value="{Binding Value, Mode=TwoWay}"
    Minimum="{Binding Lower, Mode=OneWay}"
    Maximum="{Binding Upper, Mode=OneWay}"
    />

现在,如果我知道 Lower 属性 是一个 int,我可以将它与某种 XAML 强制转换绑定吗?我已经尝试了一些东西

Minimum="{Binding Lower(sys:Int32), Mode=OneWay}"
Minimum="{Binding Lower.(sys:Int32), Mode=OneWay}"

我没想到这些会起作用,但它们没有起作用。但是语法(如果有的话)让我难以理解。我能让它工作的唯一方法是在 class 中定义一个单独的 属性,return 将 Lower 作为 int

有没有办法在 XAML 中进行拆箱转换?

您可以 运行 通过 IValueConverter:

public class NonConverter : IValueConverter
{
    public object Convert(object v, Type t, object p, CultureInfo c) => v;

    public object ConvertBack(object v, Type t, object p, CultureInfo c) => v;
}

资源:

<Window.Resources>
    <local:NonConverter x:Key="nonConverter"></local:NonConverter>
</Window.Resources>

绑定:

Minimum="{Binding Lower, Mode=OneWay, Converter={StaticResource nonConverter}}"

不知道有没有更简单的方法


这是使用 ProgressBar.NET Framework 4.7.2 的最小实现。我不确定 two-way 绑定会发生什么。

MainWindow.xaml

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp1"
        Title="MainWindow" Height="200" Width="400">
    <Window.Resources>
        <local:NonConverter x:Key="nonConverter"></local:NonConverter>
    </Window.Resources>
    <Grid>
        <ProgressBar Height="20" Width="200"
            Minimum="{Binding Lower}"
            Maximum="{Binding Upper, Converter={StaticResource nonConverter}}"
            Value="{Binding Value, Converter={StaticResource nonConverter}}"
        />
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public object Lower { get; set; }
        public object Upper { get; set; }
        public object Value { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;
            
            Lower = 1000.0d; // double
            Upper = "2000"; // string 
            Value = 1500.0m; // decimal
        }
    }

    public class NonConverter : IValueConverter
    {
        public object Convert(object v, Type t, object p, CultureInfo c) => v;

        public object ConvertBack(object v, Type t, object p, CultureInfo c) => v;
    }
}

为便于说明,三个属性中的每一个都分配了不同的类型。

NonConverter 没有转换、转换或 un/boxing 任何东西,它只是返回它收到的相同输入 v。实际转换由框架处理。

因为Lower是一个(盒装)double,这里不需要转换器。