2014-09-25 52 views
0

我一直堅持試圖重用我的WPF應用程序的佈局代碼。重新使用綁定的WPF佈局XAML?

我試圖讓一個XML編輯器,讓你打開多個文件(通過標籤)。

我的情況是這樣的:

<TabControl> 
    <TabItem> 
    // Layout XAML with various {Binding} sources (File 1) 
    </TabItem> 
    <TabItem> 
    // Layout XAML with various {Binding} sources (File 2) 
    </TabItem> 
    <TabItem> 
    // Layout XAML with various {Binding} sources (File 3) 
    </TabItem> 
</TabControl> 

這工作;然而,三個TabItems中的每一個都是大量拷貝&粘貼的代碼,只更改了一些名稱以避免重複的名稱。

我想重寫代碼以這樣的方式,這樣的事情是可能的:

<TabControl> 
    <TabItem> 
    // Reference to Template 
    </TabItem> 
    <TabItem> 
    // Reference to Template 
    </TabItem> 
    <TabItem> 
    // Reference to Template 
    </TabItem> 
</TabControl> 

而且有模板定義別處。

我試圖用一個的DataTemplate爲模板,和的ContentTemplate它分配給每個的TabItem,但雖然佈局正確顯示,所有的{}綁定了丟失。

我已經廣泛搜索,但一直沒能弄清楚我應該如何接近這一點。

我將非常感謝任何鏈接到演示,將顯示如何實現綁定,而無需複製&粘貼代碼。

我也希望提供調試失敗綁定的任何提示,除非在工作之前嘗試。 (我很喜歡用調試器調試C#,但不知道如何檢查XAML的東西)

在此先感謝!

+0

你是什麼意思,綁定失去了?數據模板化將不會刪除綁定字符串(請參閱'ItemTemplate'的每個用法) – BradleyDotNET 2014-09-25 17:37:27

+0

我在TabControl外部有一個XmlDataProvider。在TabControl中,我有一些東西,如ItemsSource =「{Binding}。當我運行程序時,如果我使用模板,數據不會顯示在屏幕上 – Brent 2014-09-25 17:38:38

+0

@Brent你最好是包裝製表符行爲它自己的視圖模型 – Crono 2014-09-25 17:40:49

回答

0

您應該使用Window的ViewModel用ObservableCollection表示您的選項卡項目。

<TabControl ItemsSource="{Binding Path=TabItems, Mode=OneTime}" SelectedValue="{Binding Path=SelectedTab, Mode=TwoWay}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding Header}"/> 
      <Setter Property="Content" Value="{Binding}"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabItem}"> 
         <Grid> 
          <Border Name="Border" Margin="0,0,-4,0" BorderThickness="1"> 
           <ContentPresenter 
            x:Name="ContentSite" 
            HorizontalAlignment="Center" 
            Margin="12,2,12,2" 
            VerticalAlignment="Center" 
            ContentSource="Header" 
            RecognizesAccessKey="True"/> 
          </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
             etc... 

          </Trigger> 
          <Trigger Property="IsMouseOver" Value="True"> 
             etc... 

          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

然後每個標籤項目都是一個視圖模型本身,其中包含您需要爲每個標籤綁定的所有數據。例如:

public ObservableCollection<TabItemViewModel> TabItems 
{ 
    get 
    { 
     return m_SuspendTabItems; 
    } 
    private set 
    { 
     if (Equals(m_SuspendTabItems, value)) 
     { 
      return; 
     } 

     m_SuspendTabItems = value; 

     NotifyPropertyChanged(s_SuspendTabItems); 
    } 
} 

將在您的主WindowViewModel。要添加新選項卡,只需調用TabItems.Add(new TabItemViewmodel());.

其中「TabItemViewModel」包含您對該特定選項卡項目的綁定。

0

我會建議編寫一個自定義UserControl,其中包含您現在正在複製粘貼的所有內容,並將此UserControl添加到選項卡項目中。將此所需的源添加到此UserControl作爲依賴項屬性。現在,您可以從TabControl訪問它,而不會丟失綁定。

我做了一個快速非工作示例:

MyControl。XAML

<UserControl Name=this> 
    <StackPanel> 
     <TextBox Text={Binding Something, ElementName=this} /> 
    </StackPanel> 
</UserControl> 

MyControl.xaml.cs

public partial class MyControl : UserControl 
{ 
    public static readonly DependencyProperty SomethingProperty = DependencyProperty.Register("Something", typeof(string), typeof(MyControl)); 

    public string KeyType 
    { 
     get { return (string)GetValue(SomethingProperty); } 
     set { SetValue(SomethingProperty , value); } 
    } 
} 

program.xaml

<Window> 
    <TabControl> 
     <TabItem> 
      <MyControl Something={Binding Anything[0] /> 
     </TabItem> 
     <TabItem> 
      <MyControl Something={Binding Anything[1] /> 
     </TabItem> 
     //... 
    </TabControl> 
</Window> 

program.xaml.cs

//... 
public string[] Anything { get; set; } 
//... 

請注意,這只是一個很簡單的例子。您可以輕鬆地將您需要的模型添加到ObservableCollection並自動生成選項卡。