2017-02-21 44 views
-1

说我有以下 -检索应用程序设置

<TreeView ...> 
    <TreeView.Resources> 
     <command:DoSomethingCommand x:Key="DoSomethingCommand"/> 
    </TreeView.Resources> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate 
        ItemsSource="{Binding Children}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}"/> 
       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="DoSomething" 
           Command="{StaticResource DoSomethingCommand}" 
           CommandParameter="{Binding Mode=OneWay}"/> 
... 

DoSomethingCommand需要从一般应用程序设置的东西。可以说它是一个保存命令,并且需要目录位置默认为。

我该如何获得ICommand实现?

+0

您的命令应该可能直接从设置类读取这种情况下没有绑定到参数 – MikeT

回答

1

您应该可以直接在执行ICommandProperties.Settings.Default.NameOfTheSetting之间访问它,试图通过XAML对我来说似乎不是个好主意。

如果你真的想,添加了xmlns:通过类似

xmlns:properties="clr-namespace:TestSettings.Properties" 

然后,你可以绑定到它:

<MenuItem Header="Some Menu" 
      Command="{Binding Path=SomeCommand}" 
      CommandParameter="{Binding Source={x:Static properties:Settings.Default}, 
            Path=SomeSetting, 
            Mode=OneWay}" /> 
+0

谢谢。我不喜欢使用Properties.Settings.Default,因为它然后将代码耦合到只有一个实例。未来会发生什么,如果我们想让这些窗口中的两个具有不同的设置? – Hector

+1

你还在访问'Settings'吗?应用程序只有一个(活动)其“设置”类的实例。 –

+0

如果你需要别的东西,把它作为视图模型的属性,并绑定到*那*。这与上面所示的概念相同。 –

0

有两种选择,我可以从你的代码段见。

  1. 交付在你HierarchicalDataTemplate适当的财产通过您的视图模型的CommandParameter结合。您应该符合{Binding FilePath, Mode=OneWay}的名称,您可以声明该名称为stringPathCommandParameter然后将它作为一个对象,您可以通过ICommand.Execute(object parameter)

  2. 直接在ICommand.Execute()方法内引用静态属性。

+0

问题是,要作用的对象已经作为命令参数传递。 静态看起来是一个坏主意 - 如果将来我们需要两个这两个用户面板都需要自己的设置? – Hector

+0

那么,你的应用程序属性*中的项目设置是静态的。也许你实际上是指'设置',即你的模型中的属性? – NWoodsman