2012-09-12 110 views
1

我是WPF开发人员的初学者。 我创建了一些框架内的窗口。 我为框架写了一个模板,我试图绑定到freame模板命令中的按钮,但没有成功。绑定一个命令不起作用

看到下面的代码:

<Grid.Resources> 
<ControlTemplate TargetType="Frame" x:Key="NavigationButtonsTemplates"> 
       <DockPanel> 
        <StackPanel 
      Margin="7" 
      Orientation="Horizontal" 
      DockPanel.Dock="Bottom" 
      HorizontalAlignment="Right" 
      > 
         <Button 
       Content="Back" 
       Command="{x:Static NavigationCommands.BrowseBack}" 
       Margin="5,0,5,0" Width="80" /> 

         <Button 
       Content="Next" 
       Command="{Binding Path=NavigateToPersonalDataCommand}" 
       Margin="5,0,5,0" Width="80"></Button> 
        </StackPanel> 
        <Border 
      BorderBrush="LightBlue" 
      Margin="7,8,9,0" 
      BorderThickness="7" 
      Padding="5" 
      CornerRadius="7" 
      Background="White" 
      > 
         <ContentPresenter /> 
        </Border> 
       </DockPanel> 
      </ControlTemplate> 
     </Grid.Resources> 

看来这个按钮的结合是行不通的。 当我把按钮放在标签外面时,它的功能完美无缺。 如何将命令绑定到位于的按钮?

感谢

回答

1

ControlTemplate需要具有DataContext。尝试更改DockPanel元素以绑定到模板框架上的DataContext属性。这假定正在模板化的Frame具有有效的DataContext

<DockPanel DataContext="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"> 

<DockPanel DataContext="{TemplateBinding DataContext}"> 

编辑:

试图运行你的代码后,我发现这个问题。您在XAML中绑定的属性与视图模型中的属性不匹配。

将您的XAML更改为绑定到视图模型上的属性名称可以修复问题。

从这:

Command="{Binding Path=NavigateNext}" 
Command="{Binding Path=NavigateToPersonalData}" 

要这样:

Command="{Binding Path=BrowseNext}" 
Command="{Binding Path=NavigateToPersonalDataCommand}" 

,以配合您的视图模型属性:

public ICommand BrowseNext 
{ 
    get 
    { 
     return m_BrowseNext; 
    } 
    set 
    { 
     m_BrowseNext = value; 
    } 
} 

public ICommand NavigateToPersonalDataCommand 
{ 
    get 
    { 
     return m_PersonalDataCommand; 
    } 
    set 
    { 
     m_PersonalDataCommand = value; 
    } 
} 
+0

仍然无法正常工作,我尝试了两种选择。这些按钮不执行任何命令。 – Ofir

+0

有没有其他想法? – Ofir

+0

@CharlieGrinvald你可以发布你使用模板的代码吗?我需要更多信息。 –

0

这是XAML代码:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestProj" 
    x:Class="TestProj.MainView" 
    x:Name="Window" 
    Title="MainView" 
    Width="640" Height="480"> 
    <Window.DataContext> 
     <local:NavigationViewModel/> 
    </Window.DataContext> 

    <Grid x:Name="LayoutRoot"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.25*"/> 
      <RowDefinition Height="0.25*"/> 
      <RowDefinition Height="0.25*"/> 
      <RowDefinition Height="0.25*"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.20*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Grid.Resources> 
      <ControlTemplate TargetType="Frame" x:Key="NavigationButtonsTemplates"> 
       <DockPanel DataContext="{TemplateBinding DataContext}"> 
        <StackPanel 
      Margin="7" 
      Orientation="Horizontal" 
      DockPanel.Dock="Bottom" 
      HorizontalAlignment="Right" 
      > 
       <Button 
       Content="Back" 
       Command="{Binding Path=NavigateNext}" 
       Margin="5,0,5,0" Width="80" /> 

         <Button 
       Content="Next" 
       Command="{Binding Path=NavigateToPersonalData}" 

       Margin="5,0,5,0" Width="80"></Button> 
        </StackPanel> 
        <Border 
      BorderBrush="LightBlue" 
      Margin="7,8,9,0" 
      BorderThickness="7" 
      Padding="5" 
      CornerRadius="7" 
      Background="White" 
      > 
         <ContentPresenter /> 
        </Border> 
       </DockPanel> 
      </ControlTemplate> 
     </Grid.Resources> 

     <Button Content="Opening" Grid.Row="0"></Button> 
      <Button Content="Personal Data" Grid.Row="1"></Button> 
     <Button Content="Business Data" Grid.Row="2"> </Button> 
     <Button Content="Summery Report" Grid.Row="3"></Button> 

     <DockPanel Grid.Column="2" Grid.RowSpan="4"> 
      <Frame x:Name="mainFrame" Template="{StaticResource NavigationButtonsTemplates}"/> 

     </DockPanel> 
    </Grid> 
</Window> 

在这里,我怎么写的命令:

class NavigationViewModel 
    { 
     private ICommand m_BrowseNext; 
     public ICommand BrowseNext 
     { 
      get 
      { 
       return m_BrowseNext; 
      } 
      set 
      { 
       m_BrowseNext = value; 
      } 
     } 

     private ICommand m_PersonalDataCommand; 
     public ICommand NavigateToPersonalDataCommand 
     { 
      get 
      { 
       return m_PersonalDataCommand; 
      } 
      set 
      { 
       m_PersonalDataCommand = value; 
      } 
     } 

     public NavigationViewModel() 
     { 
      BrowseNext = new RelayCommand(new Action<object>(NavigateNext)); 
      NavigateToPersonalDataCommand = new RelayCommand(new Action<object>(NavigateToPersonalData)); 
     } 


     public void NavigateToPersonalData(object obj) 
     { 
      MainView.Instance.GetMainFrame.Navigate(Pages.Opening.Instance); 
     } 

     public void NavigateNext(object obj) 
     { 
      MainView.Instance.GetMainFrame.Navigate(Pages.PersonalData.Instance); 
     } 
    } 

当我移动的命令之外的按钮的伟大工程,所以我认为这个问题是在XAML。

谢谢!

+0

我更新了解决问题的答案。将来,您应该将问题的更新添加到实际问题中,而不是将其发布为答案。 –