2010-04-09 54 views
2

我尝试在SampleCommand执行时更改Page1.xaml中的帧的源属性。 我如何在视图模型中实现这一点?在MMVM中实现命令

的Page1.xaml:

<Page ...> 
<DockPanel> 
    <r:ribbon>   
     <r:RibbonTab Label="Keys"> 
      <r:RibbonTab.Groups> 
       <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}"> 
        <r:RibbonGroup.Command> 
         <r:RibbonCommand LabelTitle="RibbonButton"/> 
        </r:RibbonGroup.Command> 
        <r:RibbonButton x:Name="RibbonButton1" Command="{Binding Path=SampleCommand}"/> 
       </r:RibbonGroup> 
      </r:RibbonTab.Groups> 
     </r:RibbonTab> 
    </r:Ribbon> 

    <Border Name="PageBorder" Grid.Row="0" Grid.Column="1"> 
     <Frame Name="pageFrame" Source="FirstPage.xaml" /> 

    </Border> 
</DockPanel> 
</Page> 

Page1ViewModel.cs:

RelayCommand _sampleCommand; 

public ICommand SampleCommand 
{ 
    get 
    { 
     // create command ?? 

     return _sampleCommand 
    } 
} 

page1.xaml.cs:

Page1ViewModel pageViewModel; 

//When page loads 

this.DataContext = pageViewModel; 

回答

3

根据其实现RelayCommand的你使用,它应该将一个Action作为其构造函数的参数,该构造函数表示实现时要调用的代码。因此,在您的视图模型:

_sampleComand = new RelayCommand(() => DoStuff()); 

这里的事情,不过,是你要调用浏览你的“页框”控制,该视图模型将无法访问。

可能最简单的方法是将Frame的NavigationService作为参数传递给命令。您可能需要更改_sampleCommand的声明,以便它知道它需要一个参数; RelayCommand的一些实现也定义了一个RelayCommand<T>这是一个接受强类型参数的命令。

private ICommand _sampleCommand; 
... 
_sampleCommand = new RelayCommand<NavigationService>(
    ns => ns.Navigate(destinationUri)); 

所以,现在你需要在框架的的NavigationService传给命令:

<r:RibbonButton x:Name="RibbonButton1" 
       Command="{Binding Path=SampleCommand}" 
       CommandParameter="{Binding NavigationService,ElementName=pageFrame}" 
       /> 

由于您的视图模型很可能将有一大堆导航命令,它可能更容易建立一个属性ViewModel本身的NavigationService类型,并在初始化事件时让页面将其挂钩到其框架。这样,您可以引用该属性,而不是每次将它作为命令参数传入。