Reset combobox selected item on set using MVVM
Try changing the XAML to this
<ComboBox ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
This is a very interesting question. First I agree with other guys that this is a not recommended approach to handle invalid selection. As @blindmeis suggests, IDataErrorInfo
is one of good way to solve it.
Back to the question itself. A solution satisfying what @Faisal Hafeez wants is:
public string SelectedItem
{
get { return _selectedItem; }
set
{
var oldItem=_selectedItem;
_selectedItem=value;
OnPropertyChanged("SelectedItem")
if (!SomeCondition(value)) //If does not satisfy condition, set item back to old item
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => SelectedItem = oldItem),
DispatcherPriority.ApplicationIdle);
}
}
Dispatcher
is an elegant way to handle some UI synchronization during another UI sync. For example in this case, you want to reset selection during a selection binding.
A question here is why we have to update selection anyway at first. That's because SelectedItem
and SelectedValue
are separately assigned and what display on ComboBox
does not depend on SelectedItem
(maybe SelectedValue
, I am not sure here). And another interesting point is if SelectedValue changes, SelectedItem
must change but SelectedItem
does not update SelectedValue
when it changes. Therefore, you can choose to bind to SelectedValue
so that you do not have to assign first.
I know this is a bit late but as of WPF 4.5 you can use the Delay command like so:
<ComboBox ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem, Mode=TwoWay, Delay=1, UpdateSourceTrigger=PropertyChanged}" />
This saved me after hours of looking up stuff the other day. For other methods which may or may not work you can read this post and its comments.