Wpf, как найти имя элемента из одного пользовательского элемента управления в другом

    <TextBox x:Name="DescriptionTextBox" 
             Text="{Binding SelectedEntity.Description,
                            ValidatesOnExceptions=True}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="LostFocus" SourceName="DescriptionTextBox">
                <ei:CallMethodAction MethodName="RaiseCanExecuteChanged" 
                TargetObject="{Binding Command, ElementName=SaveButton}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>

    <userControls:SaveCloseUserControl />

Внутри этого пользовательского элемента управления

<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
    <Button Width="50"
            Command="{Binding SaveCommand}"
            Content="Save" />
    <Button Width="50"
            Command="{Binding CloseCommand}"
            Content="Close" />
 </StackPanel>

Проблема здесь заключается в том, что этот TargetObject="{Binding Command, ElementName=SaveButton}" не находит SaveButton, потому что он находится внутри userControls:SaveCloseUserControl. Я посмотрел в Интернете и нашел решение (с 2009 года), для которого необходим код, не существует ли легкий способ сделать это сегодня? С уважением

редактировать

Основываясь на ответе @huzle, я сделал это в коде пользовательского элемента управления

    public object CreateButton { get { return CreateChild; } }

и в xaml я добавил имя к кнопке сохранения.

так что моя финальная версия выглядит так

    <TextBox x:Name="DescriptionTextBox" 
             Text="{Binding SelectedEntity.Description,
                            ValidatesOnExceptions=True}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="LostFocus" SourceName="DescriptionTextBox">
                <ei:CallMethodAction MethodName="RaiseCanExecuteChanged" 
                TargetObject="{Binding CreateButton.Command,ElementName=MySaveCloseUserControl}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>

    <userControls:SaveCloseUserControl x:Name="MySaveCloseUserControl"/>

1 ответ

Решение

Присвойте свой "SaveCloseUserControl" открытые свойства для "SaveButton" с именем "InnerSaveButton" и свяжите его с ElementName в свой SaveCloseUserControl и используйте "Путь" для перехода к команде вашей внутренней кнопки.

<TextBox x:Name="DescriptionTextBox" 
         Text="{Binding SelectedEntity.Description,
                        ValidatesOnExceptions=True}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="LostFocus" SourceName="DescriptionTextBox">
            <ei:CallMethodAction MethodName="RaiseCanExecuteChanged" 
            TargetObject="{Binding InnerSaveButton.Command, ElementName=MySaveCloseUserControl}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

<userControls:SaveCloseUserControl X:Name="MySaveCloseUserControl"/>
Другие вопросы по тегам