Mi aplicación está utilizando avalondock & prims y tenía ese problema exacto. Tengo el mismo pensamiento con BSG, cuando cambiamos la pestaña o el contenido del documento en la aplicación MVVM, los controles como listview + box, el cuadro combinado se elimina de VisualTree. Me bugged y vi que la mayoría de los datos de ellos se restableció a nulo, como itemssource, selecteditem, .. pero selectedboxitem todavía tenía el valor actual.
Un enfoque es en el modelo, comprobar su valor es nulo luego regresar como esto:
private Employee _selectedEmployee;
public Employee SelectedEmployee
{
get { return _selectedEmployee; }
set
{
if (_selectedEmployee == value ||
IsAdding ||
(value == null && Employees.Count > 0))
{
return;
}
_selectedEmployee = value;
OnPropertyChanged(() => SelectedEmployee);
}
Pero este enfoque sólo puede resolver bastante bien en el primer nivel de consolidación. quiero decir, cómo vamos si queremos vincular a SelectedEmployee.Office a combobox, haga lo mismo no es bueno si marca el evento propertyChanged del modelo SelectedEmployee.
Básicamente, no queremos que su valor se restablezca nulo, conserve su valor previo. Encontré una nueva solución consistentemente. Mediante el uso de la propiedad adjunto, he creado un KeepSelection-Pro, tipo bool, para los controles de selección, así el suministro de toda su herencia como chupar vista de lista, cuadro combinado ...
public class SelectorBehavior
{
public static bool GetKeepSelection(DependencyObject obj)
{
return (bool)obj.GetValue(KeepSelectionProperty);
}
public static void SetKeepSelection(DependencyObject obj, bool value)
{
obj.SetValue(KeepSelectionProperty, value);
}
// Using a DependencyProperty as the backing store for KeepSelection. This enables animation, styling, binding, etc...
public static readonly DependencyProperty KeepSelectionProperty =
DependencyProperty.RegisterAttached("KeepSelection", typeof(bool), typeof(SelectorBehavior),
new UIPropertyMetadata(false, new PropertyChangedCallback(onKeepSelectionChanged)));
static void onKeepSelectionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var selector = d as Selector;
var value = (bool)e.NewValue;
if (value)
{
selector.SelectionChanged += selector_SelectionChanged;
}
else
{
selector.SelectionChanged -= selector_SelectionChanged;
}
}
static void selector_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selector = sender as Selector;
if (e.RemovedItems.Count > 0)
{
var deselectedItem = e.RemovedItems[0];
if (selector.SelectedItem == null)
{
selector.SelectedItem = deselectedItem;
e.Handled = true;
}
}
}
}
final, yo uso este enfoque simplemente en XAML:
<ComboBox lsControl:SelectorBehavior.KeepSelection="true"
ItemsSource="{Binding Offices}"
SelectedItem="{Binding SelectedEmployee.Office}"
SelectedValuePath="Id"
DisplayMemberPath="Name"></ComboBox>
Pero el elemento seleccionado nunca se anulará si los elementos del selector tienen elementos. Puede afectar algún contexto especial.
Espero que ayude. Feliz conding!: D
longsam
¿Ha marcado * en el código * que el elemento seleccionado se está configurando la primera vez?He tenido algunos casos en los que la selección es visible, pero el elemento seleccionado es== nulo, especialmente con las clases de SubSonic 3. – SteveCav
Es una buena idea, pero el valor definitivamente se almacena la primera vez. Cuando rompo, puedo ver que 'value = null' y mi variable está almacenando el valor previamente seleccionado. – bsg
¿Puedes mostrar la pila de llamadas para ese punto de interrupción? –