我遇到了一個案例,其中我有一個回傳型別的類object,我碰巧知道它只是一個裝箱的int值。我正在使用的控制元件可以系結到一個int屬性或一個double屬性,但它不能系結到一個裝箱 int或double. 我必須解決這個限制。我想以一種非常簡單的方式做到這一點。
編輯添加: 當我嘗試這樣做時發生的例外是System.NotSupportedException訊息DoubleConverter cannot convert from System.Int32
那么有沒有一種方法可以在 XAML 中進行強制轉換int,double這相當于拆箱操作?我已經知道如何在 XAML 中強制轉換參考型別,因此我可以訪問一些特定的派生類屬性。但是我遇到了這個問題,因為int它不是具有屬性的型別。
下面是類(簡化版)。它表示一組范圍內的整數或雙精度數,甚至是其他型別,其中“min”和“max”值將是有意義的。所以它必須將它們全部作為物件回傳。無論如何,所有 3 個屬性都將在裝箱值中回傳相同的基礎型別,無論是它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}"
我沒想到其中任何一個會起作用,而他們沒有。但是語法(如果有的話)讓我望而卻步。關于我可以讓它作業的唯一方法是在類中定義一個單獨的屬性,該屬性回傳Lower作為一個int值
有沒有辦法在 XAML 中進行拆箱強制轉換?
uj5u.com熱心網友回復:
您可以通過以下方式運行它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 的最小實作。我不確定雙向系結會發生什么。
主視窗.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>
主視窗.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不是轉換、轉換或取消/裝箱任何東西,它只是回傳它收到的相同輸入v。實際的轉換由框架處理。
因為Lower是 (boxed) double,所以這里不需要轉換器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/433740.html
