2014-01-08 2 views
0

У меня есть следующий app.xaml:Установка вложенное свойство в App.xaml

<BaseApp x:Class ="MyApp" 
     xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local ="clr-namespace:MyApp" 
     Props.MyCustom="test" 
     Startup ="Application_Startup"         
     > 

<Application.Resources > 
    < ResourceDictionary> 
     ... 
    </ ResourceDictionary>   

</Application.Resources> 

то мне нужно, чтобы быть в состоянии прочитать свойство от базового приложения:

public partial class BaseApp : Application 
{   

     static void MyFunc() 
     { 
      // Access property from here 
      var myvar = Props.MyCustom 
     } 
} 

В настоящее время я работаю над убеждением, что это должно быть в отдельном классе, а именно:

public class Props : DependencyObject 
{ 
    public string MyCustom 
    { 
     get { return (string)GetValue(MyCustomProperty); } 
     set { SetValue(MyCustomPropertyKey, value); } 
    } 

    public static readonly DependencyPropertyKey MyCustomPropertyKey = 
     DependencyProperty.RegisterAttachedReadOnly("MyCustom" , typeof (string), typeof (Props), new UIPropertyMetadata (0));   

    public static readonly DependencyProperty MyCustomProperty = MyCustomPropertyKey.DependencyProperty; 

} 

Я правильно подхожу к этому, и если да, то что мне нужно сделать, чтобы иметь доступ к этому из app.xaml?

EDIT:

Для будущих путешественников, как я, наконец, удался это было просто объявить абстрактное свойство только для чтения в базовом классе и переопределить его в коде позади. Не такой аккуратный, как мне бы хотелось, но он работает.

ответ

1

Прикрепленные свойства должны иметь статические методы получения и установки, в вашем случае:

public static string GetMyCustom(DependencyObject obj) 
{ 
    return (string)obj.GetValue(MyCustomProperty); 
} 

public static void SetMyCustom(DependencyObject obj, string value) 
{ 
    obj.SetValue(MyCustomProperty, value); 
} 

Сказав, что вы все равно должны иметь экземпляр DependencyObject -derived класса, чтобы установить свойство на , который System.Windows.Application нет. Другими словами, вы не можете установить прикрепленное свойство в свой объект MyApp.


Вместо того, чтобы использовать вложенное свойство, вы можете просто добавить простое свойство CLR для вашего BaseApp класса:

public class BaseApp : Application 
{ 
    public string MyCustom { get; set; } 
} 

и использовать его как это:

<local:BaseApp x:Class="MyNamespace.MyApp" ... 
       MyCustom="Hello"> 
    <Application.Resources> 

    </Application.Resources> 
</local:BaseApp> 
+0

Вы говорите, что это невозможно сделать с прикрепленными свойствами или что это невозможно сделать вообще? –

+1

Точно. Прикрепленные свойства - это свойства зависимостей и поэтому могут быть заданы только экземплярами классов, которые происходят из 'DependencyObject'. – Clemens

+0

Тогда это возвращает меня к первоначальному вопросу: «Я подхожу к этому правильно?» Есть ли другой способ добиться того же? –

Смежные вопросы