2012-02-23 20 views
12

Nuevo en WPF. Tengo un teclado numérico en pantalla para escribir un PIN. Lo que quiero hacer es desactivar los botones cuando se ingresan cuatro dígitos de PIN. Ciertamente puedo hacer esto con código bastante fácilmente, pero me parece que es el tipo de cosa que se debe hacer con el enlace.Encuadernación a una expresión

Algo así como:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox ???}/> 

Parece que no hay una manera de hacerlo Así que considera la alternativa, que es una propiedad normal en el (que para ser honesto parece bastante primitivo para mí.) Clase de ventana subyacente. Pero no estoy seguro de cómo vincularlo (¿tengo que especificar la clase en sí misma como su propio contexto de datos, o necesito extraer la cadena del PIN en un Modelo de visualización?)

Y luego, ¿cómo Obtengo la propiedad simple para actualizar la GUI.

Supongo que podría definir una clase de modelo de vista y tener una propiedad de dependencia llamada "ButtonsEnabled" pero parece una especie de peso pesado para un problema tan simple.

Dejarme saber si me falta algo.

+0

se puede tratar [** su componente de unión (botón) a función **] (http://social.msdn.microsoft.com/Forums/en/wpf/thread/b92178bc-bc1a-4ec0-ad94-b86bbf2ea56a) –

Respuesta

11

puede escribir un convertidor que volver booleano dependiendo de dígitos en el cuadro de texto

El XAML fo botón r sería

<Button Content="Test" IsEnabled="{Binding ElementName=PinBox,Path=Text,Converter={StaticResource DigitsToBoolConverter}}" Grid.Row="1" Height="20" Width="100"></Button> 

donde PinBox es el nombre del cuadro de texto utilizado para ingresar el pin.

La función Converter es

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    return value.ToString().Length >= 4; 
} 
3

No, no falta nada, las asociaciones de WPF listas para usar no admiten expresiones.

Ha habido algunas personas de aplicar sus propias clases que aportan este tipo de funcionalidad: http://www.11011.net/wpf-binding-expressions

Pero en realidad, esto es lo que el patrón de modelo de vista es para. Úselo, no es pesado.

+0

ese enlace ya no funciona. – brainydexter

+0

Dado que tiene más de 5 años, no estoy sorprendido :) – Tyson

+0

@brainydexter ¿podría usar la máquina de retorno? https://web.archive.org/web/20160313063004/http://www.11011.net/wpf-binding-expressions Pero dado que tiene más de 5 años, sugeriría un nuevo enlace de google 'wpf incluyendo expresión' o algo como eso. – Tyson

0

Crea un converter que devolverá verdadero o falso basado en PinBox.Text.Length.

Su xaml se convertiría entonces en:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox, Converter={StaticResource yourConverter}}/> 
8

Otra forma de utilizar commands:

XAML:

<Button Content="2" Style="Whatever" Command={Binding MyCommand} CommandParamater="2"/> 

modelo de vista:

public ICommand MyCommand { get; private set; } 
public string PinNumber { get; private set; } 
public void Init() 
{ 
    MyCommand = new RelayCommand(
    param => AddPinNumberDigit(param), 
    param => CanAddPin); 
} 
private void AddPinNumberDigit(string digit) 
{ 
    PinNumber += digit; 
} 
public bool CanAddPin { 
    get 
    { 
    return PinNumber.Length < 3; 
    } 
} 
+0

Me encanta esta respuesta y aprendí mucho de ella, pero finalmente usé el convertidor. Desearía poder aceptar ambos, pero te devolví el voto. –

Cuestiones relacionadas