Pregunta

Como parte del aprendizaje de WPF acabo de terminar de trabajar a través de un ejercicio de laboratorio EM llamada "Uso de Enlace de datos en WPF" ( http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx ).

Para ilustrar el uso de un IMultiValueConverter, hay una aplicación pre-codificada de uno donde se utiliza el resultado booleano para determinar si el enlace de datos es relevante para el usuario actual. Aquí está la clave de la operación de conversión:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
        // var rating = int.Parse(values[0].ToString());
        var rating = (int)(values[0]);
        var date = (DateTime)(values[1]);

        // if the user has a good rating (10+) and has been a member for more than a year, special features are available
        return _hasGoodRating(rating) && _isLongTimeMember(date);
    }

Y aquí está el cableado de utilizar esto en el XAML:

<ComboBox.IsEnabled>
    <MultiBinding Converter="{StaticResource specialFeaturesConverter}">
    <Binding Path="CurrentUser.Rating" Source="{x:Static Application.Current}"/>
    <Binding Path="CurrentUser.MemberSince" Source="{x:Static Application.Current}"/>
    </MultiBinding>
</ComboBox.IsEnabled>

El código funciona muy bien, pero el diseñador XAML no se carga con una "conversión especificada no es válida." error. He intentado un par de maneras de no usar un yeso, una de las cuales he dejado sin comentar en el código de seguridad. Lo curioso es un ejercicio de laboratorio acabado proporcionado por MS también tiene el error.

¿Alguien sabe cómo solucionarlo a hacer feliz al diseñador?

Saludos, España Berryl

¿Fue útil?

Solución

El problema aquí es que utiliza Application.Current, que es diferente en el modo de diseño y en tiempo de ejecución.

Cuando abierta de diseño, Application.Current no será la clase de "App" (o lo que sea lo que sea). Por lo tanto hay ninguna propiedad CurrentUser allí, y su consiguen ese error.

Hay varias maneras de solucionarlo. La más fácil es comprobar si se encuentra en modo de diseño:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
  if (Application.Current == null ||
      Application.Current.GetType() != typeof(App))
  {
    // We are in design mode, provide some dummy data
    return false;
  }

  var rating = (int)(values[0]);
  var date = (DateTime)(values[1]);

  // if the user has a good rating (10+) and has been a member for more than a year, special features are available
  return _hasGoodRating(rating) && _isLongTimeMember(date);
}

Otro enfoque sería no utilizar Application.Current como fuente para su unión.

Espero que esto ayude:)

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top