none
WPF MVVM, динамическое изменение представления (вью) RRS feed

  • Вопрос

  • Есть главное окно, RibbonWindow, в нем описаны все меню риббон бар, они общие для всех вью. В риббонбар есть опция, изменить вью на такой-то.
    Разметка главного окна:
    <odc:RibbonWindow x:Class="Work.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:odc="clr-namespace:Odyssey.Controls;assembly=Odyssey" IsGlassEnabled="True"
            Height="Auto" Width="Auto" MinWidth="100" MinHeight="300"
           Closed="WindowClosed">
    
        <DockPanel Name="dpMain">
            <DockPanel Name="dpRibbon">    </DockPanel>
            
            //раньше тут был контейнер с единственно нужным вью, сейчас вью стало несколько, и их надо опционально изменять
        </DockPanel>
    </odc:RibbonWindow>
    
    После инициализации главного окна:
                    InitializeComponent();
    
                    var viewModel = new ViewModelMain// Создали ViewModel
                    DataContext = viewModel; // положили ViewModel во View в качестве DataContext
                    ChangeView("ViewOne"); //тут выбрали некоторый вью
    
    Главное окно содержит метод:
            void ChangeView(string str)
            {
                if (str == "ViewOne")
                {
                         //?
                }
                else if (str == "ViewTwo")
                {
                            //?
                }
           }
    
    Или надо сначала выбрать вью, а потом уже DataContext ? Сами вью я вынес в юзерконтролы, там же прописаны все биндинги. Как мне выбрать вью вообще, и как потом в ChangeView изменить вью?



    • Изменено Qwester33 16 ноября 2011 г. 10:31
    • Перемещено PashaPash 26 ноября 2011 г. 16:26 (От:Языки программирования)
    16 ноября 2011 г. 10:28

Ответы

  • Используйте DataTemplateSelector
    • Предложено в качестве ответа PashaPash 16 ноября 2011 г. 12:05
    • Помечено в качестве ответа Qwester33 16 ноября 2011 г. 12:37
    16 ноября 2011 г. 10:44
    Отвечающий
  • Касательно селектора: он нужен в случае, если у вас одни и теже данные нужно представлять в различно виде. Например у вас есть список, который нужно показывать либо в детальном виде, либо в виде списка, либо в виде картинок. Тогда вы применяете DataTemplateSelector. Либо у вас один объект, но у него два вида - показать данные подробно или кратко.

    Если же у вас вьюшки меняются вместе с ViewModel-ями, то этот способ сюда не подходит. В этом случае вам стоит использовать ContentPresenter. Пример: вы сделали меню а-ля табы и при смене таба у вас должно измениться содержимое страницы динамически. Тогда это как раз случай для использования ContentPresenter-а.

    • Помечено в качестве ответа Qwester33 17 ноября 2011 г. 0:31
    16 ноября 2011 г. 14:55
    Отвечающий
  • Я совсем запутался ((( В том примере вообще показывалось как использовать селектор. Но селектор можно заюзать не только в листе, но и в ContentPresenter-е. Какое-то странное ощущение, что вы хотите при выборе в комбобоксе какого-то пункта, менять только вью, тогда как вьюмодел остается та же.

    Посмотрите вот на это, возможно это как раз то, что вам нужно. Это тот случай, когда для одной и той же ViewModel нужно несколько представлений.

     

    • Помечено в качестве ответа Qwester33 18 ноября 2011 г. 13:20
    17 ноября 2011 г. 16:15
    Отвечающий
  • Попробуйте прописать явно биндинг на контент у ContentControl-а. Кстати, а зачем вам ContentControl, вам нужен именно контрол, а не контейнер как ContentPresenter?

    <ContentPresenter Content="{Binding}" />
    

    • Помечено в качестве ответа Qwester33 21 ноября 2011 г. 13:21
    21 ноября 2011 г. 7:41
    Отвечающий
  • У вас в итоге в контент прописался не ViewModel, а строка "ViewOne". Уберите последнюю строчку и все заработает (но конечно без переключения, оно у вас не на то поле завязано):

    //cp.Content = "ViewOne"; <- удалить

    Чтобы поменять шаблон нужно либо менять какое-то свойство во ViewModel, либо в селекторе. В селектор же будет прилетать не строка, а ViewModel.

    У вас же в комбобоксе выбирается значение. Можете его передавать сразу в селектор (через какое-то свойство), либо присваивать какому-то свойству во ViewModel и проверять его в селекторе.


    • Изменено Anton.MaksimovEditor 22 ноября 2011 г. 4:29
    • Помечено в качестве ответа Qwester33 23 ноября 2011 г. 11:50
    22 ноября 2011 г. 4:29
    Отвечающий
    • Помечено в качестве ответа Qwester33 26 ноября 2011 г. 2:04
    25 ноября 2011 г. 11:14
    Отвечающий
  • Это был хотфикс со stackoverflow (мне он не очень нравится, но путного ничего в голову не приходило больше). Замена такая делалась для того, чтобы сказать селектору, что неплохо было бы поменять вьюшку, он же не подписывался на событие OnPropertyChanged и не знает, что SelectedView изменилась, поэтому он ничего и не делает. В итоге получился такой клудж. Если найдете более красивое решение, напишите в эту тему.

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

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

    • Помечено в качестве ответа Qwester33 26 ноября 2011 г. 9:34
    26 ноября 2011 г. 7:11
    Отвечающий

Все ответы

  • Используйте DataTemplateSelector
    • Предложено в качестве ответа PashaPash 16 ноября 2011 г. 12:05
    • Помечено в качестве ответа Qwester33 16 ноября 2011 г. 12:37
    16 ноября 2011 г. 10:44
    Отвечающий
  •         public void ChangeView(string view)
            {
                switch (view)
                {
                    case "ViewOne":
                        dpView.Children.Clear();
                        dpView.Children.Add(new ViewOne());
                        break;
                    case "ViewTwo":
                        dpView.Children.Clear();
                        dpView.Children.Add(new ViewTwo());
                        break;
                }
            }
    

    Так вот тоже работает, без мучений с разметкой. У меня же все биндинги внутри вью, в МайнВиндоу только контейнер под вью.


    По ссылке там вроде-бы ситуация, когда надо по разному показывать элемент в зависимости от того, что это за элемент, но показывать надо все элементы, которых много. Но ведь этого же самого можно добиться через конвертер, стили и Style.Triggers и DataTrigger ? Или я неправильно понял пример?

    Если делать через DataTemplateSelector, это получается куча кода. Уточните, пожалуйста, ситуацию по DataTemplateSelector.


    • Изменено Qwester33 17 ноября 2011 г. 6:30
    16 ноября 2011 г. 12:38
  • Касательно селектора: он нужен в случае, если у вас одни и теже данные нужно представлять в различно виде. Например у вас есть список, который нужно показывать либо в детальном виде, либо в виде списка, либо в виде картинок. Тогда вы применяете DataTemplateSelector. Либо у вас один объект, но у него два вида - показать данные подробно или кратко.

    Если же у вас вьюшки меняются вместе с ViewModel-ями, то этот способ сюда не подходит. В этом случае вам стоит использовать ContentPresenter. Пример: вы сделали меню а-ля табы и при смене таба у вас должно измениться содержимое страницы динамически. Тогда это как раз случай для использования ContentPresenter-а.

    • Помечено в качестве ответа Qwester33 17 ноября 2011 г. 0:31
    16 ноября 2011 г. 14:55
    Отвечающий
  • 1. У меня во вью как-бы два ListView так, что в каждом элементе первого ListView находится еще один ListView.

    2. Вьюмодель состоит из вьюмодели для первого списка и вьюмодели для второго списка. Для разных вью вьюмодели не меняются. То есть, по сути вьюмодель одна.

    3. Во вью мне надо, чтобы показывало, к примеру, либо:

    3.1. Первый список по горизонтали, создавая для каждого его элемента юзерконтрол1, а для каждого элемента второго списка юзерконтрол2 

    3.2. Первый спискок по вертикали, создавая для каждого его элемента юзерконтрол3, а для каждого элемента второго списка юзерконтрол4

    Я не понимаю, как мне применить пример по ссылке:

      <Grid>
         <ListView ScrollViewer.CanContentScroll="False" 
                  ItemsSource="{Binding ElementName=This, Path=PathCollection}" 
                  ItemTemplateSelector="{StaticResource imgStringTemplateSelector}">
         </ListView>
       </Grid>
    

    Если на месте этого списка из примера будет мой первый список, то он же у меня забинден на вьюмодель для всех случаев, и каждый элемент должен показывать одинакого. Что тогда будет переключать ItemTemplateSelector?

    Мне надо переключатель именно вьюмоделей, то есть типа если в меню выбрано 1, то отображаем все по пункту 3.1, если выбрано 2, то по пункту 3.2

    • Изменено Qwester33 17 ноября 2011 г. 12:12
    17 ноября 2011 г. 12:09
  • Я еще пробовал биндить на переменную View, отвечающую за то, какое вью надо показывать, а все то, что раньше было в разных вью, поместить с юзерконтролы (ViewOne и ViewTwo) но не работает:

     

        <Window.Resources>
            <DataTemplate x:Key="viewOneTemplate">
                <v:ViewOne></v:ViewOne>
            </DataTemplate>
    
            <DataTemplate x:Key="viewTwoTemplate">
                <v:ViewTwo></v:ViewTwo>
            </DataTemplate>
    
            <v:ViewTemplateSelector x:Key="viewTemplateSelector"
                                    ViewOneTemplate="{StaticResource viewOneTemplate}"
                                    ViewTwoTemplate="{StaticResource viewTwoTemplate}"/>
        </Window.Resources>
    
        <DockPanel>
            <DockPanel Name="dpView">
                <ListView ScrollViewer.CanContentScroll="False" 
                  ItemsSource="{Binding View}" 
                  ItemTemplateSelector="{StaticResource viewTemplateSelector}">
                    
                </ListView>
            </DockPanel>   
        </DockPanel>
    

        public partial class MainWindow : RibbonWindow, INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
    
            private string _view;
            public string View
            {
                get { return _view; }
                set
                {
                    if (value == _view) return;
                    _view = value;
                    NotifyPropertyChanged("View");
                }
            }
    
            public MainWindow()
            {
                    InitializeComponent();
    
                    var viewModel = new ViewModelMain();
                    DataContext = viewModel
                    View = "ViewOne";
            }
    
    }

     

    Селектор:

        public class ViewTemplateSelector : DataTemplateSelector
        {
            public DataTemplate ViewOneTemplate { get; set; }
            public DataTemplate ViewTwoTemplate { get; set; }
    
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                switch ((string)item)
                {
                    case "ViewOne":
                        return ViewOneTemplate;
                    case "ViewTwo":
                        return ViewTwoTemplate;
                }
                return ViewOneTemplate;
            }
        }
    

     Оповещение происходит, но не выполняется код в ViewTemplateSelector



    • Изменено Qwester33 17 ноября 2011 г. 12:51
    17 ноября 2011 г. 12:30
  • Я совсем запутался ((( В том примере вообще показывалось как использовать селектор. Но селектор можно заюзать не только в листе, но и в ContentPresenter-е. Какое-то странное ощущение, что вы хотите при выборе в комбобоксе какого-то пункта, менять только вью, тогда как вьюмодел остается та же.

    Посмотрите вот на это, возможно это как раз то, что вам нужно. Это тот случай, когда для одной и той же ViewModel нужно несколько представлений.

     

    • Помечено в качестве ответа Qwester33 18 ноября 2011 г. 13:20
    17 ноября 2011 г. 16:15
    Отвечающий
  • Благодаря Вам постепенно вроде-бы разбираюсь, сделал ContentTemplateSelector, и принципиально он работает (мне такое поведение и надо было), но возникла другая проблема:
     
    Вот код MainWindow:
        <Window.Resources>
            <DataTemplate x:Key="viewOneTemplate">
                <v:ViewOne></v:ViewOne>
            </DataTemplate>
    
            <DataTemplate x:Key="viewTwoTemplate">
                <v:ViewTwo></v:ViewTwo>
            </DataTemplate>
    
            <v:ViewContentTemplateSelector
                 x:Key="viewContentTemplateSelector" 
                 ViewOneTemplate="{StaticResource viewOneTemplate}"
                 ViewTwoTemplate="{StaticResource viewTwoTemplate}"/>
        </Window.Resources>
    
        <DockPanel>
            <DockPanel Name="dpView">
    
                <ContentControl Name="сс"
                             ContentTemplateSelector="{StaticResource viewContentTemplateSelector}"/>
    
            </DockPanel>        
        </DockPanel>
    

    И плюс реализован селектор, его код я не привожу, там все стандартно. При установлении значения сс, после инициализации MainWindow, переключение вью происходит, но содержимое вью не отображается (то есть открывается просто пустое окно).
     
    Вот пример юзерконтрола, который я пытаюсь подсунуть во вью:
     
    <UserControl x:Class="Work.Views.ViewOne"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" d:DesignHeight="100" d:DesignWidth="300">
    
        <DockPanel>
            <ListView Name="lvwFirst" ItemsSource="{Binding ViewModelForFirstList}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" IsSynchronizedWithCurrentItem="True">
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel/>
    
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
    
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Height="Auto" Width="Auto">
                            <StackPanel Height="20" Width="Auto" Orientation="Horizontal">
                                <StackPanel Height="Auto" Width="Auto" Orientation="Horizontal">
                                    <DockPanel Height="Auto" Width="Auto" LastChildFill="False" FlowDirection="LeftToRight" DockPanel.Dock="Top">
                                        <TextBlock Text="{Binding S}"  Height="Auto" Width="30" TextAlignment="Center" DockPanel.Dock="Left" />
                                        <TextBlock Text="{Binding P}" Height="Auto" Width="30" TextAlignment="Center" DockPanel.Dock="Left" />
                                        <TextBlock Text="{Binding A}" Height="Auto" Width="30" TextAlignment="Center" DockPanel.Dock="Left" />
                                    </DockPanel>
                                    <DockPanel Height="Auto" Width="Auto" LastChildFill="False" FlowDirection="LeftToRight" DockPanel.Dock="Top">
                                        <Button Command="{Binding BlockS}" Content="text1" Height="Auto" Width="35" DockPanel.Dock="Left"/>
                                        <Button Command="{Binding BlockB}" Content="text2" Height="Auto" Width="35"/>
                                    </DockPanel>
                                    <DockPanel Height="Auto" Width="Auto" DockPanel.Dock="Bottom" LastChildFill="False">
                                    </DockPanel>
                                </StackPanel>
                            </StackPanel>
                            <ListView Name="lvwSecond" ItemsSource="{Binding ViewModelForSecondtList}">
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <DockPanel Height="Auto" Width="Auto" LastChildFill="False" FlowDirection="LeftToRight" DockPanel.Dock="Top">
                                            <Button Command="{Binding BlockS}" Content="text1" Height="Auto" Width="35" DockPanel.Dock="Left"/>
                                            <Button Command="{Binding BlockB}" Content="text2" Height="Auto" Width="35"/>
                                        </DockPanel>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </DockPanel>
    </UserControl>
    
    В окне вывода написано, не сработал биндинг: System.Windows.Data Error: 40 : BindingExpression path error: ViewModelForFirstList property not found on 'object' ''String' (HashCode=481418040)'. BindingExpression:Path=ViewModelForFirstList; DataItem='String' (HashCode=481418040); target element is 'ListView' (Name=lvwFirst); target property is 'ItemsSource' (type 'IEnumerable')
    При этом, если такое вью указать прямо в коде MainWindow (как в коде ниже), то все отображается нормально. Видимо, проблема в неправильном использовании ContentControl
     
        <DockPanel>
            <DockPanel Name="dpView">
    
                  <v:ViewOne></v:ViewOne>
    
            </DockPanel>        
        </DockPanel>
    




    • Изменено Qwester33 18 ноября 2011 г. 16:10
    18 ноября 2011 г. 14:33
  • Попробуйте прописать явно биндинг на контент у ContentControl-а. Кстати, а зачем вам ContentControl, вам нужен именно контрол, а не контейнер как ContentPresenter?

    <ContentPresenter Content="{Binding}" />
    

    • Помечено в качестве ответа Qwester33 21 ноября 2011 г. 13:21
    21 ноября 2011 г. 7:41
    Отвечающий
  • Поменял  ContentControl на ContentPresenter, прописал биндинг, но поведение осталось такое-же - открывает пустое окно:
        <DockPanel>
            <DockPanel Name="dpView">
    
                <ContentPresenter Name="cp"
                                  ContentTemplateSelector="{StaticResource viewContentTemplateSelector}"
                                  Content="{Binding}" />
    
            </DockPanel>        
        </DockPanel>
    
    

    Я в прошлый раз еще не указал C#-код MainWindow. Вот его конструктор:
                    InitializeComponent();
    
                    var viewModel = new ViewModelMain
                    DataContext = viewModel;
                    cp.Content = "ViewOne";
    
    21 ноября 2011 г. 13:30
  • У вас в итоге в контент прописался не ViewModel, а строка "ViewOne". Уберите последнюю строчку и все заработает (но конечно без переключения, оно у вас не на то поле завязано):

    //cp.Content = "ViewOne"; <- удалить

    Чтобы поменять шаблон нужно либо менять какое-то свойство во ViewModel, либо в селекторе. В селектор же будет прилетать не строка, а ViewModel.

    У вас же в комбобоксе выбирается значение. Можете его передавать сразу в селектор (через какое-то свойство), либо присваивать какому-то свойству во ViewModel и проверять его в селекторе.


    • Изменено Anton.MaksimovEditor 22 ноября 2011 г. 4:29
    • Помечено в качестве ответа Qwester33 23 ноября 2011 г. 11:50
    22 ноября 2011 г. 4:29
    Отвечающий
  • Убрал строку, теперь при открытии окна вижу не пустоту, а строку : ViewModels.ViewModelMain.  В селектор передается ViewModelMain.

    Вот код ViewModelMain:

     

        public class ViewModelMain : ViewModelBase
        {
            public ObservableCollection<ViewModelCar> CarsViewModel { get; set; }
    
            public ViewModelMain(IEnumerable<Car> cars)
            {
                CarsViewModel = new ObservableCollection<ViewModelCar>(cars.Select(s => new ViewModelCar(s)));
            }
        }
    

    В нее передается коллекция, для каждого элемента которой должна создаваться вьюдель ViewModelCar. В итоге я всегда должен видеть список машин,  мне не нужно переключение вьюмоделей, мне нужно переключение вью. То есть, к примеру, при значении комбобокса "1" показывать все машины в профиль (ViewOne), при значении "2" - снизу (ViewTwo).

    Я не могу понять, как работает селектор. Я думал, что он просто смотрит на переданную переменную, и в зависимости от ее значения, выполняет код xaml c  viewOneTemplate или с viewTwoTemplate, устанавливая контентом то, что прописано внутри Template. А если внутрь шаблона засунуть соответствующий юзерконтрол, представляющий собой вью, то все будет работать.

    Я ведь все сделал по примеру: http://zamjad.wordpress.com/2011/09/21/using-contenttemplateselector/. Или там в селектор передаются строки не потому, что это переменные-переключатели, а потому, что строки и являются контентом? А мне в селектор надо передавать вью? Я полностью запутался.

    И все работает если я пишу просто: 

        <DockPanel>
            <DockPanel Name="dpView">
    
                  <v:ViewOne></v:ViewOne>
    
            </DockPanel>        
        </DockPanel>
    
    

     

    • Изменено Qwester33 24 ноября 2011 г. 15:45
    24 ноября 2011 г. 15:36
    • Помечено в качестве ответа Qwester33 26 ноября 2011 г. 2:04
    25 ноября 2011 г. 11:14
    Отвечающий
  • Большое спасибо за помощь и пример! Никак у меня в голове не укладывалась эта схема.

    До такого я бы сам не додумался:

     

                var content = contentPresenter.Content;
                contentPresenter.ClearValue(ContentPresenter.ContentProperty);
                contentPresenter.SetValue(ContentPresenter.ContentProperty, content);

     

    Вставил в конце обработчика выбора вью, и все заработало. Если я еще не окончательно Вас утомил, объясните пожалуйста, почему не будет работать:

     

            private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (contentPresenter == null)
                    return;
    
                ViewModel.SelectedView = "Template 2";
            }

     

    По идее-же, меняем свойство во вьюмодели, свойство должно уведомить вью, вью должно измениться. Ну то есть событие то поднимается, я вижу в отладчике, а почему не меняется шаблон?

    И что делает приведенные сначала код? Запоминает содержимое contentPresenter, затем очищает его ContentProperty, а затем опять ContentProperty присваивается запомненное содержимое? Это просто такой способ как-бы "перегрузить" содержимое, так как при перегрузке будет отображено то вью, которое окажется выбрано?

    • Изменено Qwester33 26 ноября 2011 г. 3:49
    26 ноября 2011 г. 2:53
  • Это был хотфикс со stackoverflow (мне он не очень нравится, но путного ничего в голову не приходило больше). Замена такая делалась для того, чтобы сказать селектору, что неплохо было бы поменять вьюшку, он же не подписывался на событие OnPropertyChanged и не знает, что SelectedView изменилась, поэтому он ничего и не делает. В итоге получился такой клудж. Если найдете более красивое решение, напишите в эту тему.

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

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

    • Помечено в качестве ответа Qwester33 26 ноября 2011 г. 9:34
    26 ноября 2011 г. 7:11
    Отвечающий
  •         public void ChangeView(string view)
            {
                switch (view)
                {
                    case "ViewOne":
                        dpView.Children.Clear();
                        dpView.Children.Add(new ViewOne());
                        break;
                    case "ViewTwo":
                        dpView.Children.Clear();
                        dpView.Children.Add(new ViewTwo());
                        break;
                }
            }
    
    


    Просто я пытался сделать все "по-уму", а с селектором кода вышло раза в три больше, чем вышеприведенное решение, которое у меня так же и работает.

    26 ноября 2011 г. 9:39
  • Столкнулся сам с этой проблемой. Вспомнил, что решение не нравилось, попробовал покопать ещё немного, получилось следующее:

    <!--Resources-->
    <DataTemplate x:Key="t1">
           <TextBlock Text="T1" />
    </DataTemplate>
    <DataTemplate x:Key="t2">
           <TextBlock Text="T2" />
    </DataTemplate>
    <!--Internal style-->
    <Style TargetType="ContentControl">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=...UseT1}" Value="True">
                <Setter Property="ContentTemplate" Value="{DynamicResource t1}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=...UseT1}" Value="False">
                <Setter Property="ContentTemplate" Value="{DynamicResource t2}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

    И таки получилось по-уму ;)

    28 марта 2012 г. 15:18
    Отвечающий