TabItem Binding WPF - PullRequest
       9

TabItem Binding WPF

5 голосов
/ 03 июня 2010

Я только изучаю WPF и могу использовать некоторую помощь. У меня есть приложение, которое использует TabControl и динамически генерирует новые вкладки, на каждой вкладке у меня есть один TextBox, и теперь я хотел бы добавить кнопку отмены на панель инструментов, которая не является частью вкладки (как VisualStudio). Кнопка отмены должна работать только на TextBox, который находится на активной вкладке, и если нет вкладки или отмена не может быть выполнена, она будет отключена. И я понятия не имею, как связать эти два элемента (содержимое вкладки имеет собственный файл xaml).

Единственное, что мне удается, - это добавить событие clickHandler в MenuItem и затем найти текстовое поле на активной вкладке по имени, но теперь я не могу включить / отключить, как хотелось бы.

Надеюсь, это понятно. Спасибо за любую помощь

Ответы [ 3 ]

8 голосов
/ 03 июня 2010

Я сделал пример, чтобы проиллюстрировать «правильный путь WPF» для реализации этого сценария. Опять же, он может не соответствовать коду, который у вас уже есть, но он должен дать вам некоторые идеи о том, как адаптировать ваш код. Во-первых, код позади:

public partial class TabItemBinding : Window
{
    public ObservableCollection<TextItem> Items { get; set; }

    public TabItemBinding()
    {
        Items = new ObservableCollection<TextItem>();

        Items.Add(new TextItem() { Header = "1", Content = new TextBox() { Text = "First item" } });
        Items.Add(new TextItem() { Header = "2", Content = new TextBox() { Text = "Second item" } });
        Items.Add(new TextItem() { Header = "3", Content = new TextBox() { Text = "Third item" } });

        InitializeComponent();
    }
}

public class TextItem
{
    public string Header { get; set; }
    public FrameworkElement Content { get; set; }
}

Здесь нет ничего сумасшедшего, я просто создаю класс модели и собираю коллекцию этого класса. Истинное совершенство происходит в XAML:

<Window x:Class="TestWpfApplication.TabItemBinding"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TabItemBinding" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <ToolBar Grid.Row="0">
        <Button Command="Undo">Undo</Button>
    </ToolBar>

    <TabControl Grid.Row="1" ItemsSource="{Binding Items}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="Header" Value="{Binding Header}"/>
                <Setter Property="Content" Value="{Binding Content}"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>
</Grid>

Я подключаю Button к ApplicationCommands.Undo, который автоматически позаботится об отмене для нас, пока у нас будет активное редактирование TextBox. Сам TabControl привязан к коллекции, которую мы создали в коде, который предоставит заголовок и некоторый текст для редактирования. И любые изменения, которые мы сделаем, будут отменены. Результат:

Снимок экрана http://img706.imageshack.us/img706/2866/tabitembinding.png

Кстати, важно отметить, что команда отмены автоматически отключится, если нет активного контекста редактирования. Поэтому, если нет вкладок, они будут отключены без дополнительного кода с нашей стороны.

0 голосов
/ 04 июня 2010

Вас может заинтересовать пример приложения Writer проекта WPF Application Framework (WAF) . Он показывает простой редактор с вкладками MDI (похожий на Visual Studio) и реализует функцию Undo / Redo. Это может быть именно то, что вы ищете.

0 голосов
/ 03 июня 2010

То, что вы хотите, будет сделано намного проще с встроенной системой команд WPF. По сути, она имеет встроенное событие CanExecute, в котором вы можете проверить Выбранная страница TabControl и так далее. Трудно привести конкретный пример без какого-либо примера кода для работы, но, надеюсь, это укажет вам правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...