2014-02-10 4 views
0

Предположим, что у меня есть какой-то одноплодной класс вроде этого:XAML Как установить простое значение свойства без привязки

class A 
{ 
    public static A Instance { 
     get { return me; } 
    } 

    public Object SomeProperty 
    { 
     get { return something; } 
    } 
} 

и другой класс вроде этого:

class B 
{ 
    public Object TheProperty 
    { 
     get { return tp; } 
     set { tp = value; } 
    } 
} 

Если бы я использовал C# синтаксис, я бы напишите что-нибудь вроде:

b.TheProperty = A.Instance.SomeProperty 

К сожалению, я должен сделать это в XAML. Я знаю, что могу создать Свойство зависимостей для класса B, также реализовать метод PropertyChanged, и после нескольких часов скучной работы есть чудовищное решение «overkill».
Я надеюсь, что я что-то не хватает, и есть простой способ сделать это в XAML, как:

<B TheProperty={??A.Instance.SomeProperty} /> 

ответ

1

Как я и подозревал. Вам нужно использовать поставщика данных объекта.

<Window x:Class="DataPRoviderTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DataPRoviderTest" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ObjectDataProvider x:Key="provider" ObjectType="{x:Type local:B}"> 
     <ObjectDataProvider.ConstructorParameters> 
      <x:StaticExtension MemberType="{x:Type local:A}" Member="Instance"/> 
     </ObjectDataProvider.ConstructorParameters> 
    </ObjectDataProvider> 
</Window.Resources> 
<Grid> 
    <TextBlock Text="{Binding TheProperty, Source={StaticResource provider}}"/> 
</Grid> 
</Window> 

Вы также нужен новый конструктор для B, который принимает экземпляр A.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DataPRoviderTest 
{ 
    public class A 
    { 
     public static A Instance 
     { 
      get { return new A(); } 
     } 

     public Object SomeProperty 
     { 
      get { return "Hi there"; } 
     } 
    } 

    public class B 
    { 
     public Object TheProperty 
     { 
      get { return tp; } 
      set { tp = value; } 
     } Object tp = null; 

     public B(A instance) 
     { 
      TheProperty = instance.SomeProperty; 
     } 
    } 
} 
+0

Но разве это не требует моего TheProperty к быть DependencyProperty? –

+1

@TimurNuriyasov Попробуйте мое редактирование. Мне интересно, если вы будете вынуждены отказаться от ObjectDataProvider ... Есть ли причина, по которой вы не можете сделать это в коде или модели представления? Настройка графиков объектов без зависимостей не является самой сильной областью XAML. – Gusdor

+0

Это не вопрос, могу ли я сделать объект зависимости, или нет. Я просто не чувствую, что это достаточно хорошее решение. Меня раздражает, что такая тривиальная вещь требует больших усилий. –

0

попытаться использовать ключевое слово путь, как это:

<TextBlock Text="{Binding Path=PropertyName.SomeProperty}" /> 

и установить все один экземпляр свойству ИмениСвойства экземпляра, который является обязательным

+0

Да, я знаю, что люди обычно делают, когда работают с WPF. Вы пишете симпатичный маленький XAML, но ваш код становится чем-то вроде 'public Boolean State { get {return (Boolean) this.GetValue (StateProperty); } set {this.SetValue (StateProperty, value); }} общественности статической чтения DependencyProperty StateProperty = DependencyProperty.Register ( "Государство", TypeOf (Boolean), TypeOf (MyStateControl), новый PropertyMetadata (ложь)); 'плюс дополнительная часть логики для обработки PropertyChanged() события –

+0

Я думаю, вы можете сделать это с помощью простого свойства, которое повышает свойство PropertyChanged() в классе singleton. Затем установите весь экземпляр singleton в свойство экземпляра, что страница является обязательной –

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