Как: привязать к DependencyProperty элемента UserControl, если элемент управления UserControl имеет DataContext? - PullRequest
3 голосов
/ 17 февраля 2011

Моя проблема не в подключении DependencyProperties в UserControl. Это не проблема. Когда я связываю кнопку в UserControl с UserControl DependencyProperty, называемой TargetCommand, привязка прерывается, когда я устанавливаю DataContext на UserControl. Я пытался использовать FindAncestor и, конечно, ElementName, но они работают, только когда на UserControl.

нет DataContext.

Есть ли способ обойти это?

пример:

Главное окно

<Window xmlns:UserControls="clr-namespace:SomeNameSpace">
    <Grid>
         <UserControls:MyUserControl 
             TargetCommand="{Binding PathToCommand}"
             DataContext="{Binding PathToSomeModel}" />

MyUserControl Code Behind

public partial class MyUserControl : UserControl
{
    public static readonly DependencyProperty TargetCommandProperty =
        DependencyProperty.Register( "TargetCommand", typeof( ICommand ), typeof( MyUserControl ) );

    public ICommand TargetCommand
    {
        get { return (ICommand)GetValue( TargetCommandProperty ); }
        set { SetValue( TargetCommandProperty, value ); }
    }

MyUserControl - Xaml

<UserControl x:Name="root">
    <Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=TargetCommand}" />
    <Button Command="{Binding Path=TargetCommand, ElementName=root}" />

Методы привязки RelativeSource и ElementName в MyUserControl подключаются правильно, если DataContext не установлен для MyUserControl в MainWindow. Ни одна из них не работает после установки DataContext.

Есть ли способ установить DataContext в MyUserControl и при этом сохранить привязку DependencyProperty к TargetCommand?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Где находится ваш PathToCommand?Если я правильно читаю ваш пример, он должен быть где-то выше в VisualTree, чем UserControl.В этом случае вы будете привязываться к любому элементу управления, имеющему DataContext, содержащий PathToCommand, и привязываться к DataContext.PathToCommand

<Window xmlns:UserControls="clr-namespace:SomeNameSpace">
    <Grid x:Name="PART_Root">
         <UserControls:MyUserControl 
             TargetCommand="{Binding ElementName=PART_Root, Path=DataContext.PathToCommand}" />
0 голосов
/ 17 февраля 2011

Не уверен, что я что-то здесь упускаю, но зачем вам здесь DependencyProperty, когда вы устанавливаете DataContext?Почему бы не иметь в вашей модели свойство, которое можно связать непосредственно с кнопки?

...