2016-02-04 2 views
3

У меня есть окно, которое выглядит как этотWPF связать кнопку из шаблона окна для команды ViewModel в

enter image description here

Как Вы можете видеть, что есть кнопки на «панели окна» сама, и Я хочу, чтобы связать команду кнопки повелению ViewModel в

Вот как визуальное дерево выглядит

enter image description here

Я пробовал различные combinatios с помощью RelativeSource, но не может найти способ, чтобы это работало ..

Любой вид помощи или идеи будут оценены

Код для самого окна ..

<dx:DXWindow x:Class="Chronos.WindowsApp.Windows.TimersCollectionWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:themes="http://schemas.devexpress.com/winfx/2008/xaml/core/themekeys" 
      mc:Ignorable="d" 
      Title="Timers" 
      ShowInTaskbar = "False" 
      ShowIcon="True" Icon="/Chronos.UserControls;component/Images/TimersWindowIconW.png" 
      d:DesignHeight="80" d:DesignWidth="80" 
      > 

    <dx:DXWindow.Resources> 
     <ControlTemplate x:Key="{themes:FloatingContainerThemeKey ThemeName=Mishcon, ResourceKey=FloatingContainerDragWidgetTemplate, IsThemeIndependent=True}" TargetType="{x:Type Thumb}"> 
      <Border Height="40" Background="Transparent" DockPanel.Dock="Left"> 
       <DockPanel HorizontalAlignment="Left"> 
        <Button DockPanel.Dock="Left" Background="Transparent" 
          Width="70" 
          Height="35" 
          Command="{Binding RelativeSource={RelativeSource AncestorType=dx:DXWindow}, Path=RootControl.DataContext.NewTimmerCommand}" 
          > 
         <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> 
          <Image Source="{dx:DXImage Image=Add_32x32.png}" Width="24" VerticalAlignment="Center"/> 
          <TextBlock Text="Add" FontWeight="Bold" VerticalAlignment="Center"/> 
         </StackPanel> 
        </Button> 
       </DockPanel> 
      </Border> 
     </ControlTemplate> 
    </dx:DXWindow.Resources> 
</dx:DXWindow> 

ошибка я получаю:

System.Windows.Data Error: 40 : BindingExpression path error: 'RootControl' property not found on 'object' ''TimersCollectionWindow' (Name='')'. BindingExpression:Path=RootControl.DataContext.NewTimmerCommand; DataItem='TimersCollectionWindow' (Name=''); target element is 'Button' (Name=''); target property is 'Command' (type 'ICommand')

+1

Вы пробовали '{Binding RelativeSource = {RelativeSource AncestorType = дх: DXWindow}, Path = DataContext.NewTimmerCommand}" ' – StepUp

+0

Не могли бы вы показать XAML окна (упрощенный) –

+0

@Michal - как бы я сделать это? ? – Marty

ответ

0

Как Я могу видеть из вашей Binding ошибки Выражения объекта на ведьме он пытается найти свой путь в TimersCollectionWindow, если ваша команда существует внутри этого класса то я думаю, что вы должны сделать прямое связывание так:

Кнопки XAML код

<Button DockPanel.Dock="Left" Background="Transparent" 
         Width="70" 
         Height="35" 
         Command="{Binding NewTimmerCommand, UpdateSourceTrigger=PropertyChanged, Mode = TwoWay}"> 

декларация команды VM

public ICommand NewTimmerCommand 
    { 
     get { return _newTimmerCommand; } 
     set 
     { 
      _newTimmerCommand = value; 
      OnPropertyChanged("NewTimmerCommand"); 
     } 
    } 

В случае, когда ваша команда в данных контекст объекта, который использует определенный ContentTemplate, а затем просто выполните следующий. Поскольку целевой тип для вашего ContentTemplate является Thumb, он будет определенно создан вовремя, когда ContentTemplate будет использоваться, Thumb наследует свой DataContext от его родителя, таким образом вы можете полагаться на свою привязку к Thumb и получать свою команду от его (и его родительский) контекст данных.

XAML код кнопки

<Button DockPanel.Dock="Left" Background="Transparent" 
         Width="70" 
         Height="35" 
         Command="{Binding 
        RelativeSource={RelativeSource AncestorType={x:Type Thumb}}, 
        Path=DataContext.NewTimmerCommand}"> 

Update

<Button DockPanel.Dock="Left" Background="Transparent" 
         Width="70" 
         Height="35" 
         Command="{Binding 
        RelativeSource={RelativeSource AncestorType={x:Type the_type_of_RootControl}}, 
        Path=DataContext.NewTimmerCommand}"> 

С уважением.

+0

Да, вот в чем смысл ... что команда не существует в классе «TimerWindow». Команда существует в «TimersCollectionViewModel» '- который назначается как dataContext для элемента RootControl в дереве – Marty

+0

@Marty, где определен RootControl? – Ilan

+0

@Marty Только RootControl использует этот DataTemplate? – Ilan

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