Есть viewmodel.
public class VM_searchResult : DependencyObject, INotifyPropertyChanged
{
private CCard createdCard;
private Commands selectSpravInfo;
public Commands SelectSpravInfo
{
get
{
return selectSpravInfo ?? (selectSpravInfo = new Commands(obj =>
{
W_selectSprav wSelectSprav = new W_selectSprav(obj as CCard);
wSelectSprav.ShowDialog();
}));
}
}
public CCard CreatedCard
{
get { return createdCard; }
set
{
createdCard = value;
OnPropertyChanged("CreatedCard");
}
}
}
View
<StackPanel Orientation="Horizontal" DataContext="{Binding CreatedCard}">
<TextBlock Text="Номер регистрации:" Margin="10,7,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>
<TextBox x:Name="TB_regnum" Text="{Binding Regnum}" Margin="10,7,0,0" VerticalAlignment="Top" MinWidth="90"/>
<TextBlock Text="База данных:" Margin="10,7,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>
<Button x:Name="B_selectDB_card" Command="{Binding SelectSpravInfo}" CommandParameter="{Binding CreatedCard}" Content="..." Margin="10,7,0,0" VerticalAlignment="Top" Width="20"/>
<TextBox x:Name="TB_db_card" Text="{Binding Bdncpi._name}" Margin="10,7,15,0" TextWrapping="Wrap" VerticalAlignment="Top" IsEnabled="False" MinWidth="200"/>
</StackPanel>
В такой ситуации, команда SelectSpravInfo ищется в контексте CreatedCard, которой там, собственно нет. Отсюда вопрос, как выйти из этой ситуации? Не гоже как-то прописывать контекст каждому текстбоксу.
Решение. Дал имя вьюшке x:Name="root" и потом использовал его как
DataContext="{Binding ElementName=root}" Command="{Binding Path=DataContext.SelectSpravInfo}"
Даем имя элементу у которого DataContext VM_searchResult (там где лежит команда к которой нужно привязаться). Дальше биндим нужное свойство через ElementName
<UserControl x:Name="root"> <!--DataContext устанавливается например сверху -->
<StackPanel DataContext="{Binding CreatedCard}">
<Button Command="{Binding ElementName=root, Path=DataContext.SelectSpravInfo}" CommandParameter="{Binding CreatedCard}"/>
</StackPanel>
</UserControl>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей