Próbuję powiązać z właściwością całkowitą:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter=0}" />
a mój konwerter to:
[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;
}
}
problem polega na tym, że gdy wywoływany jest mój konwerter, parametrem jest łańcuch. potrzebuję, żeby to była liczba całkowita. oczywiście mogę przeanalizować ciąg, ale czy muszę?
dzięki za jakąkolwiek pomoc konstantin
wpf
binding
ivalueconverter
akonsu
źródło
źródło
Odpowiedzi:
Proszę bardzo!
<RadioButton Content="None" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <RadioButton.IsChecked> <Binding Path="MyProperty" Converter="{StaticResource IntToBoolConverter}"> <Binding.ConverterParameter> <sys:Int32>0</sys:Int32> </Binding.ConverterParameter> </Binding> </RadioButton.IsChecked> </RadioButton>
Sztuczka polega na tym, aby uwzględnić przestrzeń nazw dla podstawowych typów systemu, a następnie napisać przynajmniej powiązanie ConverterParameter w postaci elementu.
źródło
IValueConverter.Convert()
„s «parametru» parametr jestobject
. Nadal musisz to przesłać / przeanalizować ...Dla kompletności jeszcze jedno możliwe rozwiązanie (być może z mniejszą liczbą wpisywania):
<Window xmlns:sys="clr-namespace:System;assembly=mscorlib" ...> <Window.Resources> <sys:Int32 x:Key="IntZero">0</sys:Int32> </Window.Resources> <RadioButton Content="None" IsChecked="{Binding MyProperty, Converter={StaticResource IntToBoolConverter}, ConverterParameter={StaticResource IntZero}}" />
(Oczywiście
Window
można go zastąpićUserControl
iIntZero
zdefiniować bliżej miejsca rzeczywistego użytkowania).źródło
Nie wiem, dlaczego
WPF
ludzie nie chcą używaćMarkupExtension
. Jest to idealne rozwiązanie wielu problemów, w tym wspomnianej tutaj kwestii.public sealed class Int32Extension : MarkupExtension { public Int32Extension(int value) { this.Value = value; } public int Value { get; set; } public override Object ProvideValue(IServiceProvider sp) { return Value; } };
Jeśli to rozszerzenie znaczników jest dostępne w
XAML
przestrzeni nazw `` m '', przykład oryginalnego postera wygląda następująco :<RadioButton Content="None" IsChecked="{Binding MyProperty, Converter={StaticResource IntToBoolConverter}, ConverterParameter={m:Int32 0}}" />
Działa to, ponieważ parser rozszerzenia znaczników może zobaczyć silny typ argumentu konstruktora i odpowiednio przekonwertować, podczas gdy argument ConverterParameter Binding jest (mniej informacyjnie) typem obiektowym.
źródło
Value
object
int
ProvideValue
private
ProvideValue
jest wywoływana tylko raz na wystąpienie rozszerzenia znaczników, więc i tak pole powinno wystąpić tylko raz. Nie robiąc tego w konstruktorze, całkowicie unikam boksu, jeśliProvideValue
nigdy nie jest wywoływany. Jeśli chodzi o ustawienieValue
prywatne, wykluczałoby to użycie rozszerzenia znaczników wXAML
składni elementu obiektu: msdn.microsoft.com/en-us/library/…Binding.ConverterParameter
nie ma określonego typu (jest to po prostuobject
), więc parser nie wie, jaką konwersję zastosować, stąd każdy literał jest traktowany jako ciąg.{m:Int32 Value=0}
działałoby równie dobrze.)Nie używaj
value.Equals
. Posługiwać się:Convert.ToInt32(value) == Convert.ToInt32(parameter)
źródło
value.Equals
?Byłoby miło w jakiś sposób wyrazić informacje o typie dla wartości ConverterValue w XAML, ale nie sądzę, aby było to obecnie możliwe. Więc myślę, że musisz przeanalizować obiekt konwertera do oczekiwanego typu za pomocą niestandardowej logiki. Nie widzę innego sposobu.
źródło