Я добавил DependencyProperty к моему представлению, привязанный к работе DependencyProperty, но только если я не устанавливаю DataContext.Свойство DependencyProperty UserControl равно null, когда UserControl имеет DataContext
GenericView.xaml
<UserControl x:Class="GenericProject.View.GenericView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Button Command="{Binding VMFactory.CreateViewModelCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
<TextBox IsEnabled="False" Text="{Binding SomeProperty, Mode=OneWay}" />
</StackPanel>
</UserControl>
GenericView.xaml.cs
public partial class GenericView : UserControl
{
// The DependencyProperty for VMFactory.
public static readonly DependencyProperty VMFactoryProperty = DependencyProperty.Register("VMFactory", typeof(VMFactoryViewModel<GenericViewModel>), typeof(GenericView));
public VMFactoryViewModel<GenericViewModel> VMFactory
{
get { return (VMFactoryViewModel<GenericViewModel>)GetValue(VMFactoryProperty); }
set { SetValue(VMFactoryProperty, value); }
}
public GenericView()
{
InitializeComponent();
}
}
Здесь я создаю два вида, чтобы проиллюстрировать проблему под рукой. Взаимодействие VMFactory в первом представлении не будет выполнено, потому что у меня установлен DataContext. Вторая точка зрения будет успешной, в чем причина такого поведения?
MainPage.xaml
<vw:GenericView DataContext="{Binding Generic}" VMFactory="{Binding GenericFactory}" />
<vw:GenericView VMFactory="{Binding GenericFactory}" />
(Пожалуйста, игнорируйте этот ranty комментарий, если он не применяется!) Вы не создаете ViewModels инкапсулировать логику вашего UserControls, не так ли? Потому что нет. Вы НЕ создаете ViewModel для своих UserControls. UserControls должен содержать только логику пользовательского интерфейса, и они должны быть сконструированы так же, как и любой другой элемент управления. Имеет ли TextBox TextBoxViewModel? ** NO. ** PITA, с которым вы сталкиваетесь, заключается в том, что вы пытаетесь внедрить антипаттерн. Прекрати это. Вот мой ответ с более подробной информацией. Http://stackoverflow.com/a/25796096/1228 – Will
@ Если я этого не сделаю, UserControl просто должен предоставить доступ к команде, которая находится за пределами DataContext. –
... ... wut? Пользователь UserControl не должен иметь команду, которую он выставляет, он должен иметь открытый DP типа ICommand, который он использует, чтобы позволить другим виртуальным машинам связывать * свои * команды с ним. У вас не должно быть VMFactoryUserControl и VMFactoryViewModel. Это запах кода прямо там. Поэтому я не понимаю, что вы здесь делаете, я думаю. – Will