Saya mencoba mengikat ke properti integer:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter=0}" />
dan konverter saya adalah:
[ValueConversion(typeof(int), typeof(bool))]
public class IntToBoolConverter : IValueConverter
{
public object Convert(object value, Type t, object parameter, CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
{
return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
}
}
masalahnya adalah ketika konverter saya dipanggil, parameternya adalah string. saya membutuhkannya untuk menjadi integer. tentu saja saya dapat mengurai string, tetapi apakah saya harus?
terima kasih atas bantuan konstantin
wpf
binding
ivalueconverter
akonsu
sumber
sumber
Jawaban:
Ini dia!
Triknya adalah dengan memasukkan namespace untuk tipe sistem dasar dan kemudian menulis setidaknya pengikatan ConverterParameter dalam bentuk elemen.
sumber
IValueConverter.Convert()
's 'parameter' parameterobject
. Anda masih harus melakukan cast / parse ...Untuk kelengkapan, satu lagi solusi yang mungkin (mungkin dengan lebih sedikit mengetik):
(Tentu saja,
Window
dapat diganti denganUserControl
, danIntZero
dapat didefinisikan lebih dekat ke tempat penggunaan sebenarnya.)sumber
Tidak yakin mengapa
WPF
orang cenderung enggan menggunakanMarkupExtension
. Ini adalah solusi sempurna untuk banyak masalah termasuk masalah yang disebutkan di sini.Jika ekstensi markup ini tersedia di
XAML
namespace 'm', maka contoh poster asli menjadi:Ini berfungsi karena parser ekstensi markup dapat melihat tipe kuat dari argumen konstruktor dan mengubahnya sesuai, sedangkan argumen ConverterParameter Binding (kurang informatif) diketik Objek.
sumber
Value
sebuahobject
daripadaint
, untuk menghindari tinju setiap kali diProvideValue
. (Dan kemudian, buatlahprivate
untuk menghindari menugaskan sesuatu yang ilegal secara langsung).ProvideValue
hanya dipanggil sekali per contoh ekstensi markup, jadi tinju seharusnya hanya dilakukan sekali. Dengan tidak melakukannya di konstruktor, saya sama sekali menghindari tinju jikaProvideValue
tidak pernah dipanggil. Sedangkan untuk membuatValue
pribadi, ini akan menghalangi penggunaan ekstensi markup dalamXAML
sintaks elemen objek: msdn.microsoft.com/en-us/library/…Binding.ConverterParameter
tidak memiliki tipe tertentu (itu hanya anobject
) sehingga parser tidak tahu konversi apa yang harus diterapkan, maka setiap literal hanya diperlakukan sebagai string.{m:Int32 Value=0}
akan bekerja dengan baik.)Jangan gunakan
value.Equals
. Menggunakan:sumber
value.Equals
?Akan lebih baik untuk mengungkapkan informasi tipe untuk ConverterValue di XAML, tapi saya rasa itu tidak mungkin untuk saat ini. Jadi saya kira Anda harus mengurai Objek Konverter ke tipe yang Anda harapkan dengan beberapa logika khusus. Saya tidak melihat cara lain.
sumber