nullable - Establecer el valor en nulo en WPF vinculante




binding .net-3.5 string (4)

por favor, eche un vistazo a la siguiente línea

<TextBox Text="{Binding Price}"/>

¿Esta propiedad de precio desde arriba es un Decimal? (Decimal numerable).

Quiero que si el usuario elimina el contenido del cuadro de texto (es decir, ingresa cadena vacía, debería actualizar automáticamente la fuente con nulo (Nothing en VB).

¿Alguna idea sobre cómo puedo hacerlo 'Xamly'?


Answers

Puede intentar usar un ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

De la parte de atrás de mi cabeza, algo así como:

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return (double)value;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
    var doubleValue = Convert.ToDouble(value);

    return (doubleValue == 0 ? null : doubleValue);
    }
}

(Podría necesitar algunos ajustes)


Este convertidor de valor debería hacer el truco:

public class StringToNullableDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture)
    {
        decimal? d = (decimal?)value;
        if (d.HasValue)
            return d.Value.ToString(culture);
        else
            return String.Empty;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        string s = (string)value;
        if (String.IsNullOrEmpty(s))
            return null;
        else
            return (decimal?)decimal.Parse(s, culture);
    }
}

Declara una instancia de este convertidor en los recursos:

<Window.Resources>
    <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>

Y úsala en tu encuadernación:

<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>

Tenga en cuenta que TargetNullValue no es apropiado aquí: se usa para definir qué valor se debe usar cuando el source del enlace es nulo. Aquí Price no es la fuente, es una propiedad de la fuente ...


Estoy usando .NET 3.5 SP1, así que es muy simple:

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

Que significa (gracias Gregor por tu comentario):

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sys es el espacio de nombres xml importado para System en mscorlib :

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Espero que haya ayudado.


Al igual que con muchos marcos que hacen una tarea común para usted, obtiene:

  1. Probado por muchos más ojos : que solo usted mismo. Esto (con suerte) incluye pruebas unitarias, que puedes o no estar haciendo mientras construyes tu propio marco.
  2. Más legible para otros desarrolladores : nadie más tiene experiencia con su marco de MVVM personalizado. Pero si otro desarrollador se une a su proyecto, o se une a su equipo, o se une a su empresa, pueden saltar directamente al código de Prism.
  3. Mejor documentación : en la misma línea, cualquier persona que se una a una nueva persona probablemente tenga que aprender las reglas al recopilar manualmente el conocimiento colectivo de su cerebro y de cualquier otro usuario del equipo, y al consultar el código fuente. Los marcos de terceros tienen su propia documentación y muchas más publicaciones de blogs en Internet.
  4. Mejor comunidad : puede hacer preguntas en sobre "¿cómo hago X con Prism?" No puede preguntar eso con su marco personalizado.
  5. Posiblemente más capaz : al necesitar atender a más usuarios que solo a usted / su equipo, se agregarán más funciones. Si necesita hacer algo relacionado con MVVM que nunca haya hecho antes, es posible que no esté integrado en su propio marco MVVM. Pero es probable en Prism.
  6. Mejor estructura : digamos que quería hacer algo relacionado con MVVM pero no estaba en Prism. Muy probablemente, hay una buena razón para eso. Si algo no está en un marco (razonablemente maduro) hecho para trabajar en un dominio dado, eso es una señal de que lo que estás tratando de hacer es una manera antinatural o incómoda de abordar el problema. Trabajando con su propio marco, es muy fácil decir "oh agregaré esa característica", luego 6 meses después se da cuenta de que cometió un gran error porque esta nueva característica hace que su código sea muy difícil de seguir o termine siendo un vector para muchos de errores o cosas por el estilo.
  7. Una línea de pedido de CV : Tendría sentimientos encontrados hacia la contratación de alguien que haya "implementado y utilizado un marco de MVVM personalizado". Si bien podría significar que son inteligentes, también podría indicar el temido "síndrome no construido aquí". Por otro lado, poner "Microsoft Prism MVVM Framework" entre una gran lista de tecnologías podría ser bueno, pero no es sorprendente. Lo mejor de ambos mundos sería una viñeta más larga, en la línea de "Comprensión profunda del patrón MVVM, lograda implementando primero un marco MVVM de juguete con fines de aprendizaje antes de cambiar a MVVM Prism". Sí, la diferencia entre estos tres no va a hacer ni romper su CV, y el síndrome no construido aquí es algo que esperamos encontrar en una entrevista, pero vale la pena tenerlo en cuenta, especialmente si está presentando una solicitud. para un lugar que obtiene suficientes hojas de vida, pueden darse el lujo de tirar cualquier cosa que los desconcierte un poco.




wpf nullable binding .net-3.5 string