2012-09-12 183 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

我更新瞭解決問題的答案。將來,您應該將問題的更新添加到實際問題中,而不是將其發佈爲答案。 –