2012-04-11 3 views
0

У меня есть шаблон дизайна mvvm, созданный для выполнения команд и рабочих областей, чтобы кнопка нажата и отобразилось правильное рабочее пространство. Кнопки имеют привязку к шаблону, чтобы вытащить правильное изображение для шаблона на основе команды. Я добавил другое поле в команду для SelectedTemplateResource, когда кнопка выбрана из набора кнопок. DataTemplate вытягивается в главный экран, чтобы отображать кнопки.Кнопка Стиль шаблона при выборе

<DataTemplate x:Key="CommandsTemplate"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <Button.Style> 
         <Style TargetType="Button"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Path=Command}"> 
            <Setter Property="Template"> 
             <Setter.Value> 

             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 

Хочет, я хочу сделать, это установить значение сеттера в SelectedTemplateResource как и в шаблоне кнопки под названием TemplateResource. Все они обрабатываются через mainwindowviewmodel, чтобы установить соответствующий шаблон для каждой кнопки, и он работает хорошо, но я не уверен, как закончить выбранное состояние.

Кроме того, я не совсем уверен, должен ли я устанавливать привязку datatrigger к пути к команде.

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

Cheers.

EDIT Я получаю использование переключателя togglebutton, но привязка не работает. Heres некоторые больше информации, как по какой-то причине, я получаю ключ является нулевой ошибкой в ​​моем App.xaml.cs

ToggleButton является DataTemplate в файле MainWindowResources.xaml (ResourceDictionary). Файл MainWindow.xaml извлекает этот шаблон данных. У меня есть класс bindableresource, который поможет со статическим ресурсом для файла ресурсов.

public class BindableResource : StaticResourceExtension 
{ 
    #region Fields 
    private static readonly DependencyProperty dummyProperty; 
    #endregion 


    #region Properties 
    /// <summary> 
    /// Gets and sets my binding. 
    /// </summary> 
    public Binding MyBinding { get; set; } 
    #endregion 


    #region Constructor 
    /// <summary> 
    /// Static contruction of the dummy dependency property. 
    /// </summary> 
    static BindableResource() 
    { 
     dummyProperty = DependencyProperty.RegisterAttached("Dummy", typeof(string), typeof(DependencyObject), new UIPropertyMetadata(null)); 
    } 

    /// <summary> 
    /// Constructor. 
    /// </summary> 
    public BindableResource() 
    { 
    } 

    /// <summary> 
    /// Constructor with binding to set. 
    /// </summary> 
    /// <param name="binding"></param> 
    public BindableResource(Binding binding) 
    { 
     MyBinding = binding; 
    } 
    #endregion 


    #region External Members 
    /// <summary> 
    /// Get the resource key to bind to the resource. 
    /// </summary> 
    /// <param name="serviceProvider"></param> 
    /// <returns></returns> 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
     var targetObject = (FrameworkElement)target.TargetObject; 

     MyBinding.Source = targetObject.DataContext; 
     var DummyDO = new DependencyObject(); 
     BindingOperations.SetBinding(DummyDO, dummyProperty, MyBinding); 

     ResourceKey = DummyDO.GetValue(dummyProperty); 

     return base.ProvideValue(serviceProvider); 
    } 
    #endregion 
} 

Однако это не работает для значения установки триггеров.

<DataTemplate> 
       <ToggleButton Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <ToggleButton.Style> 
         <Style TargetType="ToggleButton"> 
          <Style.Triggers> 
           <Trigger Property="IsChecked" Value="True"> 
            <Setter Property="Template" Value="{Utilities:BindableResource {Binding Path=SelectedTemplateResource}}" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </ToggleButton.Style> 
       </ToggleButton> 
      </DataTemplate> 

Любые мысли или идеи?

ответ

0

Выяснив это действительно невозможно сделать в чистом XAML Я вывел из C# и создать пользовательский элемент управления ... это очень простой и может быть улучшена, и мне придется изменить немного но, в конечном счете, пользовательский контроль решает проблему, чтобы вы могли попасть в событие click из словаря ресурсов и изменить шаблон на лету.

public class TabButton : Button 
{ 
    public static readonly DependencyProperty SelectedTemplateProperty = 
     DependencyProperty.Register("SelectedTemplate", typeof(ControlTemplate), typeof(TabButton)); 

    public ControlTemplate SelectedTemplate 
    { 
     get { return base.GetValue(SelectedTemplateProperty) as ControlTemplate; } 
     set { base.SetValue(SelectedTemplateProperty, value); } 
    } 

    public TabButton() 
    { 
     this.Click += new RoutedEventHandler(TabButton_Click); 
    } 

    ~TabButton() 
    { 

    } 

    public void TabButton_Click(object sender, RoutedEventArgs e) 
    { 
     ControlTemplate template = (ControlTemplate)this.FindResource("Environmental Template Selected"); 
     (sender as TabButton).Template = template; 
    } 
} 

Cheers.

2

Я не уверен, что я точно понял, чего вы хотите. Вы хотите изменить шаблон кнопки, если выбрано yes?

Во-первых, стандартная кнопка не имеет понятия «выбрано». Для этого вам нужен ToggleButton. Таким образом, вы можете запустить свой собственный объект IsChecked, чтобы установить шаблон.

<DataTemplate x:Key="CommandsTemplate"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ToggleButton Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <ToggleButton.Style> 
         <Style TargetType="ToggleButton"> 
          <Style.Triggers> 
           <Trigger Property="IsChecked" Value="True"> 
            <Setter Property="Template" Value="{Utilities:BindableResource {Binding DataContext.SelectedTemplateResource}}"> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </ToggleButton.Style> 
       </ToggleButton> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 
+0

Это именно то, что я ищу, кнопка переключения имеет смысл, однако шаблон не переключается при нажатии на кнопку. – bl4kh4k

+0

Можете ли вы проверить свой результат на наличие ошибок привязки. Я просто угадал путь привязки в сеттер. – GazTheDestroyer

+0

Продолжает говорить, что ключ имеет нулевое значение ... ничего в выходной консоли ... метод выглядит корректно, возможно, просто глупое ограничение привязки. – bl4kh4k

Смежные вопросы