2013-12-15 3 views
1

я следующее ResourceDictonaryОпределение ResourceDictionary только один раз

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:SharedHelpers="clr-namespace:Shared.Helpers;assembly=Shared" 
        xmlns:SharedViewModels ="clr-namespace:Shared.ViewModels;assembly=Shared" 
        xmlns:SharedViews="clr-namespace:Shared.Views;assembly=Shared" 
        > 

<DataTemplate DataType="{x:Type SharedViewModels:DatabaseViewModel}"> 
    <SharedViews:DatabaseView/> 
</DataTemplate> 

<DataTemplate DataType="{x:Type SharedViewModels:ProxyViewModel}"> 
    <SharedViews:ProxiesView/> 
</DataTemplate> 

<DataTemplate DataType="{x:Type SharedViewModels:AppUserViewModel}"> 
    <SharedViews:AppUserView/> 
</DataTemplate> 
<!--ViewModels--> 
<SharedViewModels:DatabaseViewModel x:Key="DatabaseViewModel"/> 
<SharedViewModels:AppUserViewModel x:Key="AppUserViewModel"/> 
<SharedViewModels:ProxyViewModel x:Key="ProxyViewModel"/> 
</ResourceDictionary> 

как вы можете видеть эти ресурсы являются статическими и я хочу, чтобы получить доступ к ним из моих других библиотек и классов так, что я сделал это в моем приложении. XAML я сделал определение словаря как следующий

<Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary x:Name="dict" Source="ResourceDict.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 

из моего кода позади, мне нужно получить доступ к экземплярам в этом словаре, не переопределить его, поэтому я нашел

var databaseViewModelInstance = Application.Current.Resources.MergedDictionaries["dict"]["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel;

, но проблема в том, что позволяет мне получить доступ к словарю только по индексу, а не по его имени, как я могу получить доступ к словарю по его имени без необходимости определить новый ресурс словаря экземпляр в каждом классе, что я хотите получить к нему доступ?

следующие работы просто отлично

var databaseViewModelInstance = Application.Current.Resources.MergedDictionaries[0]["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel; 

ответ

2

Доступа словаря ресурсов по имени немного проблематично, так как он не является производным от FrameworkElement и, таким образом, не имеет Name свойства. Если это было, вы можете сделать следующее:

Application.Current.Resources.MergedDictionaries 
          .First(x => x.Name == "dict")["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel; 

Однако вместо фильтрации по имени, вы можете фильтровать по источнику:

Application.Current.Resources.MergedDictionaries 
          .First(x => x.Source.OriginalString == "ResourceDict.xaml")["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel; 
1

Я не уверен, если вы можете получить ResourceDictionary из коллекции MergedDictionaries по имени. Тем не менее, похоже, что вы хотите получить доступ к нему, чтобы получить в нем определенный ресурс (имеет смысл).

В этом случае вы можете подумать об использовании FrameworkElement.TryFindResource.

Это должно искать логическое дерево и в конечном итоге достигнуть уровня App.xaml. Для ясности, вы должны быть в состоянии получить DatabaseViewModel по

FrameworkElement fe = new FrameworkElement(); 
var myResource = fe.TryFindResource("DatabaseViewModel"); 
Смежные вопросы