2012-09-12 5 views
1

저는 WPF 개발 초보자입니다. 프레임이있는 창을 만듭니다. 프레임을위한 템플릿을 작성했는데 성공하지 못했던 템플릿 명령 내에서 버튼에 바인딩하려고합니다.명령 바인딩이 작동하지 않습니다.

<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="{TemplateBinding DataContext}"> 

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

또는

편집 :

코드를 실행하려고하면 나는 문제를 발견했다. 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> 
012 내가 명령을 쓴 방법은 다음과 3,516,

가 :

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

문제를 해결하기 위해 내 대답이 업데이트되었습니다. 앞으로는 답변을 게시하는 대신 질문에 대한 업데이트를 실제 질문에 추가해야합니다. –

관련 문제