Estoy usando MVVM, VS 2008 y .NET 3.5 SP1. Tengo una lista de elementos, cada uno exponiendo una propiedad IsSelected. He agregado un CheckBox para administrar la selección/des-selección de todos los artículos en la lista (actualizando la propiedad IsSelected de cada artículo). Todo funciona, excepto que la propiedad IsChecked no se actualiza en la vista cuando el evento PropertyChanged se activa para el control vinculado de CheckBox.¿Por qué mi WPF CheckBox Binding no funciona?
<CheckBox
Command="{Binding SelectAllCommand}"
IsChecked="{Binding Path=AreAllSelected, Mode=OneWay}"
Content="Select/deselect all identified duplicates"
IsThreeState="True" />
Mi VM:
public class MainViewModel : BaseViewModel
{
public MainViewModel(ListViewModel listVM)
{
ListVM = listVM;
ListVM.PropertyChanged += OnListVmChanged;
}
public ListViewModel ListVM { get; private set; }
public ICommand SelectAllCommand { get { return ListVM.SelectAllCommand; } }
public bool? AreAllSelected
{
get
{
if (ListVM == null)
return false;
return ListVM.AreAllSelected;
}
}
private void OnListVmChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AreAllSelected")
OnPropertyChanged("AreAllSelected");
}
}
no me muestra la implementación de SelectAllCommand o selección de elementos individuales aquí, pero no parece ser relevante. Cuando el usuario selecciona un solo elemento en la lista (o hace clic en el problema CheckBox para seleccionar/deseleccionar todos los elementos), he verificado que la línea de código OnPropertyChanged ("AreAllSelected") se ejecuta y el seguimiento en el depurador puede ver el evento PropertyChanged está suscrito y dispara como se esperaba. Pero el get de la propiedad AreAllSelected solo se ejecuta una vez, cuando la vista se procesa realmente. La ventana Salida de Visual Studio no informa ningún error de enlace de datos, por lo que puedo decir, la propiedad IsSelected del CheckBox está correctamente enlazada.
Si se sustituye la casilla de verificación con un botón:
<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>
y actualizar la máquina virtual:
...
public string SelectAllText
{
get
{
var msg = "Select All";
if (ListVM != null && ListVM.AreAllSelected != null && ListVM.AreAllSelected.Value)
msg = "Deselect All";
return msg;
}
}
...
private void OnListVmChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AreAllSelected")
OnPropertyChanged("SelectAllText");
}
todo funciona como se espera - el texto del botón se actualiza a medida que todos los artículos son seleccionados/desected. ¿Hay algo que me falta sobre el enlace en la propiedad IsSelected del CheckBox?
¡Gracias por cualquier ayuda!