Установка CommandTarget для выбранного элемента управления в TabControl - PullRequest
3 голосов
/ 26 мая 2010

У меня есть окно WPF с несколькими кнопками и вкладкой, в которой есть вкладка для каждого «документа», над которым работает пользователь. Tabcontrol использует DataTemplate для визуализации данных в ItemSource элемента управления tab.

Вопрос: Если нажата одна из кнопок, команда должна быть выполнена на элементе управления, отображающем документ на активной вкладке, но я понятия не имею, на что следует установить CommandTarget. Я попытался {Binding ElementName = nameOfControlInDataTemplate}, но это, очевидно, не работает.

Я попытался сделать свою проблему более абстрактной с помощью следующего кода (без объектов ItemSource и Document, но идея все та же).

<Button Command="ApplicationCommands.Save" CommandTarget="{Binding ElementName=nestedControl}">Save</Button>
<TabControl x:Name="tabControl">
    <TabControl.Items>
        <TabItem Header="Header1">Item 1</TabItem>
        <TabItem Header="Header2">Item 2</TabItem>
        <TabItem Header="Header3">Item 3</TabItem>
    </TabControl.Items>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <CommandTest:NestedControl Name="nestedControl"/>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

Я проверил код, заменив полный tabcontrol только одним NestedControl, а затем командная кнопка просто работает.

Чтобы завершить, вот код NestedControl:

<UserControl x:Class="CommandTest.NestedControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Label x:Name="label" Content="Not saved"/>
    </Grid>
</UserControl>

И код позади:

public partial class NestedControl : UserControl {
    public NestedControl() {
        CommandBindings.Add(new CommandBinding(ApplicationCommands.Save, CommandBinding_Executed));
        InitializeComponent();
    }

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) {
        label.Content = "Saved";
    }
}

1 Ответ

0 голосов
/ 26 мая 2010

Я не знаю точно, как работает CommandTarget, но привязка к активной вкладке в TabControl выполняется примерно так:

"{Binding ElementName=tabControl,Path=SelectedItem}"

(SelectedItem - текущая активная вкладка)

РЕДАКТИРОВАТЬ:

Более подробную информацию о CommandTarget можно найти здесь: Установка Command Target в XAML

РЕДАКТИРОВАТЬ 2:

Удален мой первоначальный ответ, поскольку он не был ответом на вопрос.

...