2011-04-07 35 views
6

Parece que tengo un problema con mi multiburación.MultiBinding con MultiValueConverter no actualiza

Escenario:
Tengo una ventana con dos marcadores de fecha y una vista de lista. La lista de vista contiene algunos elementos vinculados a datos llamados "entradas". Una entrada tiene una propiedad llamada "fecha".

Solo quiero que mi lista de lista muestre las entradas cuya fecha se encuentra entre mis dos fechas de datapickes.

Mi código XAML para la unión de la vista de lista a las entradas y fechas:

<ListView.ItemsSource> 
    <MultiBinding Converter="{StaticResource EntriesFilterConv}" 
       UpdateSourceTrigger="PropertyChanged"> 
    <Binding Path="Entries" UpdateSourceTrigger="PropertyChanged"/> 
    <Binding ElementName="EntryFromDate" Path="SelectedDate" 
      UpdateSourceTrigger="PropertyChanged"/> 
    <Binding ElementName="EntryToDate" Path="SelectedDate" 
      UpdateSourceTrigger="PropertyChanged"/> 
    </MultiBinding> 
</ListView.ItemsSource> 

Sin embargo, esto no funciona. Se llama a mi convertidor cuando cambia SelectedDate, pero nunca se llama cuando las entradas cambian.

Con los datos normales de unión como esta:

<ListView ItemsSource="{Binding Entries}"> 
    ... 
</ListView> 

Las actualizaciones de vista de lista normalmente. ¿Alguna idea?

+0

I eliminaría todos los UpdateSourceTriggers, deberían ser redundantes porque 'ListView' no modificará esas propiedades, por lo tanto, las fuentes nunca se actualizarán de todos modos. –

+0

Gracias, pero esto no ayudó. –

+1

Lo sé, es por eso que lo publiqué como un comentario. –

Respuesta

4

creo que el siguiente podría causar esto: Si enlaza directamente a la Entries ListView escuchará CollectionChanged eventos, pero si tal unión es el interior de un MultiBinding la única cosa que podría causar una reevaluación podría ser una notificación PropertyChanged, que podría no existir para la propiedad Entries en su modelo.

Tal vez usted puede suscribirse a la CollectionChanged caso de su colección y criar a un evento PropertyChanged o lleve a la BindingExpression dentro de su MultiBinding llamar una actualización manualmente.

+0

Lo intentaré. Pero, ¿qué propiedad debo usar? ¿Hay una propiedad llamada 'this'? –

+0

¿Cómo es tu modelo? ¿Dónde se define 'Entradas'? También eche un vistazo a la documentación INotifyPropertyChanged si no está familiarizado con eso: http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx –

+0

Tengo una clase genérica 'ViewModelCollection 'que hereda de' IList ',' INotifyCollectionChanged' y 'INotifyPropertyChanged'. En este caso, 'Entradas' es un 'ViewModelCollection '. ¿Puedo suscribirme al 'CollectionChanged' dentro de mi clase? –

8

¡Después de buscar horas, encuentro una respuesta simple y decente! Desde ObservableCollection no plantea evento PropertyChanged pero CollectionChanged, sólo tenemos que unir Count de la colección para disparar el evento cuando cambia la lista:

<MultiBinding Converter="{Resources:ListToStringConverter}"> 
    <Binding Path="List.Count" /> 
    <Binding Path="List" /> 
</MultiBinding> 

informaciones originales sobre este perfecto estado de funcionamiento unión múltiple aquí: https://stackoverflow.com/a/10884002/817504

+5

No se recomienda porque puede causar una pérdida de memoria como se puede ver aquí: [Enlace] (https://support.microsoft.com/en-us/kb/938416). Ocurre porque esa propiedad no es una propiedad de dependencia y no implementa INotifyPropertyChanged, por lo que la única forma en que WPF tiene que "enlazarse" a esa propiedad es usando PropertyDescriptor, que asocia un evento PropertyChanged que causa una referencia difícil a esa propiedad. –

+0

Interesante, gracias, ¿cuál es la solución correcta? – Profet

+1

Si tiene su propiedad en un modelo de vista, puede plantear el evento cambiado propiedad de forma manual cuando la colección cambia (en el setter, por ejemplo). –

Cuestiones relacionadas