2014-02-10 55 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方法,經過幾個小時的沉悶工作之後,會產生可怕的「矯枉過正」解決方案。
我希望我失去了一些東西,並且有一個簡單的方法來做到這一點像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

但並不需要我來利人成爲DependencyProperty? –

+1

@TimurNuriyasov試試我的編輯。我想知道你是否會被迫回退ObjectDataProvider ...有什麼理由不能在代碼隱藏或視圖模型中做到這一點?設置非依賴項對象圖不是XAML最強的區域。 – Gusdor

+0

這不是我是否可以執行依賴項對象的問題。我只是不覺得這是一個足夠好的解決方案。這讓我很煩惱,這麼瑣碎的事情需要付出很多努力。 –

0

嘗試使用路徑關鍵字如下:

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

和整個單個實例設置爲實例的屬性名財產具有約束力

+0

是的我知道這是人們通常在使用WPF時所做的。你寫了一個很好的小XAML,但是你的代碼隱藏變得像'public Boolean State {return(Boolean)this.GetValue(StateProperty); } set {this.SetValue(StateProperty,value); } } public static readonly DependencyProperty StateProperty = DependencyProperty.Register( 「State」,typeof(Boolean),typeof(MyStateControl),new PropertyMetadata(false));'另外還有一條用於處理PropertyChanged()事件的邏輯 –

+0

我想你可以用一個簡單的屬性在單例類中引發PropertyChanged()。然後將整個單例實例設置爲頁面綁定實例的屬性 –