Я не вижу абсолютно ничего плохого в использовании Code Behind при условии, что код связан со специфическими для вида свойствами, такими как настройка Focus.Ваша ViewModel никогда не должна знать или заботиться о том, кто или что находится в фокусе, поскольку это концепция View-Specific.
Обычно я создаю UserControls двумя способами: они либо создаются для конкретной модели, либо ViewModel,или они должны быть универсальными и иметь значения, предоставленные тем, кто их вызывает.
В случае с первым, например, если бы я хотел SearchResultsPopup
, я бы собрал UserControl, ожидающий что-то вродеSearchResultsViewModel
как DataContext.
Например, мой UserControl будет ожидать найти следующие свойства в своем DataContext и будет использовать их в привязках для построения представления.
ObservableCollection<SearchResult> Results
SearchResult SelectedResult
bool IsOpen
ICommand OkCommand
ICommand CancelCommand
Затем я мог бы использовать UserControl следующим образом:
<local:SearchResultsPopup DataContext="{Binding MySearchResultsVM}" />
В более поздней ситуации, когда я создаю что-то общее, что может быть использовано любой моделью или моделью представления, я бы использовал пользовательскийСвойства зависимости, чтобы предоставить моему UserControl значения, с которыми он должен связываться.
Итак, в этом примере у меня будут DependencyProperties для
bool IsOpen
ICommand OkCommand
ICommand CancelCommand
И мой XAML будет выглядеть примерно так:
<local:GenericPopup local:GenericPopup.IsOpen="{Binding IsPopupOpen}"
local:GenericPopup.SaveCommand="{Binding SavePopupCommand}"
local:GenericPopup.CancelCommand="{Binding HidePopupCommand}">
<local:MySearchResultsView ... />
</local:GenericPopup>
Таким образом, ваш UserControl является либо отражением вашей ViewModel (то есть он становится представлением), либо ему предоставляются значения посредствомПосмотреть.ViewModel не волнует в любом случае.