Мое приложение использует avalondock & prims и имело именно эту проблему.Я тоже думал с BSG, когда мы переключали вкладку или содержимое документа в приложении MVVM, элементы управления, такие как listview + box, выпадающий список, удалялись из VisualTree.Я прослушал и увидел, что большинство данных из них были сброшены до нуля, таких как itemssource, selecteditem, .. но selectedboxitem все еще содержал текущее значение.
Подход в модели, проверьте, что его значение равно нулю, а затем верните так:
private Employee _selectedEmployee;
public Employee SelectedEmployee
{
get { return _selectedEmployee; }
set
{
if (_selectedEmployee == value ||
IsAdding ||
(value == null && Employees.Count > 0))
{
return;
}
_selectedEmployee = value;
OnPropertyChanged(() => SelectedEmployee);
}
Но этот подход может решить проблему только на первом уровне привязки.Я имею в виду, как мы поступим, если хотим связать SelectedEmployee.Office с выпадающим списком, делать то же самое нехорошо, если проверка в свойстве propertyChanged модели SelectedEmployee.
По сути, мы не хотим, чтобы его значение сбрасывалось на ноль, сохраняем его-значение.Я нашел новое решение последовательно.Используя прикрепленное свойство, я создал KeepSelection a-Pro, тип bool, для элементов управления Selector, таким образом предоставив все его унаследованные отстой как listview, combobox ...
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, я использую этот подход просто в xaml:
<ComboBox lsControl:SelectorBehavior.KeepSelection="true"
ItemsSource="{Binding Offices}"
SelectedItem="{Binding SelectedEmployee.Office}"
SelectedValuePath="Id"
DisplayMemberPath="Name"></ComboBox>
Но selecteditem никогда не будет иметь нулевого значения, если в источнике предметов селектора есть предметы.Это может повлиять на какой-то особый контекст.
Надеюсь, это поможет.Счастливого кондинга!: D
longsam