Estou tentando vincular a uma propriedade inteira:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter=0}" />
e meu conversor é:
[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;
}
}
o problema é que quando meu conversor é chamado o parâmetro é string. eu preciso que seja um número inteiro. claro que posso analisar a string, mas é necessário?
obrigado por qualquer ajuda konstantin
wpf
binding
ivalueconverter
Akonsu
fonte
fonte
Respostas:
Aqui está!
O truque é incluir o namespace para os tipos básicos de sistema e, em seguida, escrever pelo menos a vinculação ConverterParameter na forma de elemento.
fonte
IValueConverter.Convert()
's 'parâmetro' parâmetro éobject
. Você ainda tem que lançar / analisar ...Para completar, mais uma solução possível (talvez com menos digitação):
(Claro,
Window
pode ser substituído porUserControl
eIntZero
pode ser definido mais próximo do local de uso real.)fonte
Não sei por que as
WPF
pessoas tendem a não querer usarMarkupExtension
. É a solução perfeita para muitos problemas, incluindo o problema mencionado aqui.Se esta extensão de marcação estiver disponível no
XAML
namespace 'm', o exemplo do autor da postagem original será:Isso funciona porque o analisador de extensão de marcação pode ver o tipo forte do argumento do construtor e converter de acordo, enquanto o argumento ConverterParameter de Binding é (menos informativamente) do tipo objeto.
fonte
Value
umaobject
vez deint
, para evitar boxe-lo cada vez emProvideValue
. (E então,private
evite atribuir algo ilegal diretamente).ProvideValue
é chamado apenas uma vez por instância de extensão de marcação, portanto, o boxing deve ocorrer apenas uma vez. Ao não fazer isso no construtor, evito o boxe completamente seProvideValue
nunca for chamado. Quanto a tornarValue
privado, isso impediria o uso da extensão de marcação naXAML
sintaxe do elemento de objeto: msdn.microsoft.com/en-us/library/…Binding.ConverterParameter
não tem um tipo específico (é apenas umobject
), então o analisador não sabe qual conversão aplicar, portanto, todo literal é tratado apenas como uma string.{m:Int32 Value=0}
funcionaria da mesma forma.)Não use
value.Equals
. Usar:fonte
value.Equals
?Seria bom expressar de alguma forma as informações de tipo para o ConverterValue em XAML, mas não acho que seja possível no momento. Então eu acho que você tem que analisar o objeto Converter para o seu tipo esperado por alguma lógica personalizada. Não vejo outra maneira.
fonte