В этой статье из codeproject показан элемент управления WPF Dialog, который делает именно то, что вам нужно. Причина, по которой эта реализация необходима, заключается в том, что вы не можете поместить Window в визуальное дерево любого другого элемента управления. Это означает, что из коробки WPF не позволяет создавать диалоги внутри окна. Таким образом, вышеприведенная статья создает подкласс ContentControl, который создает окно.
В любом случае, вы помещаете это в свой FooBarList View
<dialog:Dialog Content="{Binding Path=DialogViewModel}" />
Вы убедитесь, что у вас есть что-то подобное в словаре ресурсов где-то:
<Style TargetType="{x:Type dialog:Dialog}">
<Style.Triggers>
<Trigger Property="HasContent" Value="True">
<Setter Property="Showing" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
и просто напишите что-то вроде этого (для работы WPF необходимо реализовать INotifyPropertyChanged):
public Class FooBarListViewModel
{
IList<FooBar> FooBarList {get;set;}
FooBar SelectedFooBar {get;set;}
ViewModelBase DialogViewModel {get;set;}
public EditFooBar(object param)
{
DialogViewModel = FooBar;
}
}
Чтобы связать View для редактирования FooBar с FooBar ViewModel, просто сделайте что-то вроде этого (желательно в Application.Resources, поэтому оно глобально)
<DataTemplate DataType={x:Type vm:FooBarViewModel}>
<vw:FooBarView/>
</DataTemplate>
(Или, опционально: используйте IValueConverter для преобразования, чтобы получить ваш вид из ViewModel , как показано в этом сообщении )
И тогда все готово. Может звучать как много, но это действительно освобождает вас.