2010-06-03 143 views
5

我只是在學習WPF,我可以使用一些幫助。 我有一個應用程序,它使用TabControl並動態生成新的選項卡,每個選項卡上我有一個文本框,現在我想添加一個撤消按鈕到工具欄,而不是選項卡的一部分(VisualStudio)。撤銷按鈕只能在活動選項卡上的文本框中工作,如果沒有選項卡或者撤消操作無法執行,它將被禁用。我不知道如何綁定這兩個項目(標籤內容有它自己的xaml文件)。TabItem綁定WPF

只有我成功是增加一個點擊事件處理程序的菜單項,然後按名稱查找活動選項卡上的文本框,但現在我不能啓用/禁用像我希望的事情。

我希望這是可以理解的。 感謝您的幫助

回答

0

你想要什麼就做更容易WPF's built-in Command system.基本上,它有一個內置的「CanExecute」事件,在其中您可以檢查的TabControl的選擇的頁面等等。如果沒有任何示例代碼來處理,很難給出一個具體的例子,但希望這會讓你走上正確的道路。

8

我舉了一個例子來說明「正確的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> 

我勾了ButtonApplicationCommands.Undo,它會自動照顧撤銷對我們來說,只要我們有一個活動的編輯TextBoxTabControl本身綁定到我們在代碼隱藏方面所做的集合,它將提供一個標題和一些文本進行編輯。我們所做的任何修改都是可撤銷的。其結果是:

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

順便說,需要注意的是,如果沒有一個活躍的編輯上下文撤銷命令會自動禁用本身是很重要的。所以如果沒有標籤頁,它將被禁用,沒有任何額外的代碼。

+0

感謝嗨,這正是我需要的,但實際上我使用AvalonDock(http://avalondock.codeplex.com/)和「標籤」實際上文件。現在問題是我無法設置屬性來使它工作,如果我發佈我的代碼,你能幫我嗎? – Zviri 2010-06-03 17:15:00

+1

是的,我一定會嘗試。但是,您應該先投票並接受我的答案,然後可能會在新問題中編寫AvalonDock代碼,因爲此處提出的問題已得到充分解答。 – Charlie 2010-06-03 17:30:15

+0

如何將TabItem綁定到單選按鈕? – user2495173 2014-05-15 22:23:34

0

你可能會感興趣的WPF Application Framework (WAF)項目的作家示例應用程序。它顯示了一個帶有標籤式MDI的簡單編輯器(類似於Visual Studio),它實現了撤消/重做功能。這可能正是你正在尋找的。