我可以使用 XAML 中的强制转换对整数进行拆箱吗?
Can I unbox an integer with a cast in XAML?
我遇到过这样的情况,我有一个 class,return 类型 object
我碰巧知道它只是一个装箱的 int
值。我使用的控件可以绑定到 int
属性 或 double
属性 但它不能绑定到 [=48= 的对象]盒装int
或double
。我必须解决这个限制。我想以一种非常简单的方式这样做。
编辑添加: 当我尝试这样做时发生的异常是 System.NotSupportedException
消息 DoubleConverter cannot convert from System.Int32
那么有没有一种方法可以在 XAML 中转换为 int
或 double
,这相当于拆箱操作?我已经知道如何在 XAML 中转换引用类型,因此我可以访问一些特定的派生-class 属性。但是我遇到了这个问题,因为 int
不是具有属性的类型。
下面是class(简化版)。它表示一组范围内的整数或双精度数,甚至是“最小”和“最大”值有意义的其他类型。所以它必须 return 它们都作为对象。无论如何,所有 3 个属性都将 return 盒装值中的相同基础类型,无论是 double
或 int
还是其他。
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
,这里不需要转换器。
我遇到过这样的情况,我有一个 class,return 类型 object
我碰巧知道它只是一个装箱的 int
值。我使用的控件可以绑定到 int
属性 或 double
属性 但它不能绑定到 [=48= 的对象]盒装int
或double
。我必须解决这个限制。我想以一种非常简单的方式这样做。
编辑添加: 当我尝试这样做时发生的异常是 System.NotSupportedException
消息 DoubleConverter cannot convert from System.Int32
那么有没有一种方法可以在 XAML 中转换为 int
或 double
,这相当于拆箱操作?我已经知道如何在 XAML 中转换引用类型,因此我可以访问一些特定的派生-class 属性。但是我遇到了这个问题,因为 int
不是具有属性的类型。
下面是class(简化版)。它表示一组范围内的整数或双精度数,甚至是“最小”和“最大”值有意义的其他类型。所以它必须 return 它们都作为对象。无论如何,所有 3 个属性都将 return 盒装值中的相同基础类型,无论是 double
或 int
还是其他。
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
,这里不需要转换器。