【问题标题】:TabItem Binding WPFTabItem 绑定 WPF
【发布时间】:2010-06-03 15:49:12
【问题描述】:

我刚刚学习 WPF,我可以使用一些帮助。 我有一个使用 TabControl 并动态生成新选项卡的应用程序,在每个选项卡上我都有一个 TextBox,现在我想在工具栏上添加一个撤消按钮,它不是选项卡的一部分(类似于 VisualStudio)。撤消按钮只能在活动选项卡上的文本框上工作,如果没有选项卡或撤消无法执行,它将被禁用。而且我不知道如何绑定这两项(标签内容有它自己的xaml文件)。

我唯一成功的就是向 MenuItem 添加一个点击事件处理程序,然后按名称在活动选项卡上找到文本框,但现在我无法像我希望的那样启用/禁用。

我希望这是可以理解的。 感谢您的帮助

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    我已经做了一个例子来说明“正确的 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 本身绑定到我们在代码隐藏中创建的集合,该集合将提供一个标题和一些要编辑的文本。我们所做的任何编辑都将是可撤销的。结果:

    Screenshot http://img706.imageshack.us/img706/2866/tabitembinding.png

    顺便提一下,如果没有活动的编辑上下文,撤消命令会自动禁用自身,这一点很重要。因此,如果没有标签页,它将被禁用而无需我们任何额外的代码。

    【讨论】:

    • 嗨,谢谢,这正是我所需要的,但实际上我使用的是 AvalonDock (avalondock.codeplex.com),而“标签”实际上是文档。现在的问题是我无法设置属性以使其工作,如果我发布我的代码你能帮我吗?
    • 是的,我一定会尝试的。但是您应该先投票并接受我的回答,然后可能在新问题中编写 AvalonDock 代码,因为这里提出的问题已经得到充分回答。
    • 如何将 TabItem 绑定到单选按钮?
    【解决方案2】:

    使用WPF's built-in Command system. 可以大大轻松完成您想要的工作。基本上,它有一个内置的“CanExecute”事件,您可以在其中检查 TabControl 的选定页面等。没有任何示例代码,很难给出一个具体的例子,但希望这会让你走上正确的道路。

    【讨论】:

      【解决方案3】:

      您可能对 WPF Application Framework (WAF) 项目的 Writer 示例应用程序感兴趣。它显示了一个带有选项卡式 MDI(类似于 Visual Studio)的简单编辑器,并实现了撤消/重做功能。这可能正是您正在寻找的。​​p>

      【讨论】:

        猜你喜欢
        • 2018-04-21
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 2011-11-02
        • 2013-12-10
        • 2016-06-22
        • 2011-11-21
        相关资源
        最近更新 更多