2017-02-21 16 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

У вас должен быть доступ к нему непосредственно при реализации ICommand через Properties.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

Как еще вы получаете доступ к настройкам? Приложения имеют только один (активный) экземпляр класса 'Настройки'. –

+0

Если вам нужно что-то еще, сделайте это свойство на вашей модели просмотра и привяжите к * этому *. Это та же концепция, что и выше. –

0

Есть два варианта, я могу видеть из вашего сниппета ,

  1. Deliver надлежащее свойство связывания через ваш ViewModel к CommandParameter в вашем HierarchicalDataTemplate. Вы должны получить право на имя, то есть {Binding FilePath, Mode=OneWay}, которое вы можете объявить либо string, либо Path. CommandParameter бы тогда как объект, который можно обрабатывать с помощью ICommand.Execute(object parameter)

  2. Reference статического свойства непосредственно внутри метода ICommand.Execute().

+0

Проблема в том, что объект, на который действует, уже передается в качестве параметра команды. И статичность кажется плохой идеей. Что, если в будущем нам понадобятся две из этих пользовательских панелей, каждая из которых нуждается в собственных настройках? – Hector

+0

Ну, настройки проекта в ваших свойствах приложения * * статические. Возможно, вы на самом деле ссылаетесь на «настройки», т. Е. Свойства в вашей модели? – NWoodsman