Sunday, February 20, 2011

КАК В TABCONTROL ПРИВЯЗАТЬ ЗАКЛАДКИ ИЗ VIEWMODEL?

Есть пример, давайте его разберем кратко. Есть главная страница MainPage.xaml:

<UserControl

x:Class="TabControlBinding.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:local="clr-namespace:TabControlBinding"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<UserControl.DataContext>
<local:ViewModel />
</UserControl.DataContext>
<Grid
x:Name="LayoutRoot"
Background="White">
<Controls:TabControl
Grid.Row="1"
local:TabControlHelper.ItemsCollection="{Binding Path=Collection}">
</Controls:TabControl>
</Grid>
</UserControl>

Так же есть небольшой класс SuperTab (его-то и будем в закладки запихивать):

   public class SuperTab
   {
       public string Header { get; set; }
       public string SomeContent { get; set; }      
   }

И еще есть простенький ViewModel:

И, собственно говоря, звезда номера класс TabControlHelper, который и сделает всю "грязную работу":

   public class TabControlHelper
   {
       #region ItemsCollection
       /// <summary>
       /// свойство ItemsCollection
       /// </summary>
       public static readonly DependencyProperty ItemsCollectionProperty =
           DependencyProperty.RegisterAttached("ItemsCollection", typeof(IEnumerable), typeof(TabControl),
               new PropertyMetadata(null, new PropertyChangedCallback(OnItemsCollectionChanged)));
       /// <summary>
       /// Геттер свойства ItemsCollection.
       /// </summary>
       public static IEnumerable GetItemsCollection(DependencyObject d)
       {
           return (IEnumerable)d.GetValue(ItemsCollectionProperty);
       }
       /// <summary>
       /// Сеттер свойства ItemsCollection.
       /// </summary>
       public static void SetItemsCollection(DependencyObject d, IEnumerable value)
       {
           d.SetValue(ItemsCollectionProperty, value);
       }
Read more: МУСОРКА - НАЙДИ ЛУЧШЕЕ!