2015-12-08 100 views
0

好吧,所以我的問題是我有一個用戶控件。在xaml中,我將一些顏色綁定到我創建的顏色屬性,如下所示。用戶控件DataContext /綁定問題與依賴屬性WPF

<GradientStop x:Name="stop1" Color="{Binding Color1}" Offset="0"/> 
<GradientStop x:Name="stop2" Color="{Binding Color2}" Offset="1"/> 

在我的代碼後面我有一個DependencyProperty,我已經聲明如下所示。

public static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register("IsActive", typeof(bool), typeof(Bin), 
new PropertyMetadata(new PropertyChangedCallback(Bin.IsActivePropertyChanged))); 

依賴屬性有PropertyChangedCallback,它調用名爲IsActivePropertyChanged,如下圖所示。

private static void IsActivePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
      Bin b = (Bin)d; 
      if((bool)e.NewValue) 

      { 
       b.Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E); 
       b.Color2 = Colors.Red; 
       b.Color3 = Colors.Red; 
       b.Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); 
      } 
      else 
      { 
       b.Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E); 
       b.Color2 = Color.FromArgb(0xFF, 0x83, 0x83, 0x83); 
       b.Color3 = Color.FromArgb(0xFF, 0x63, 0x63, 0x63); 
       b.Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); 
      } 
     } 

如果我使用下面的構造函數的構造函數做工精細的內部顏色的變化,但是,我從來沒有IsActivePropertyChangedEvent得到射擊。我假設是因爲構造函數中的DataContext賦值。

public Bin() 
     { 
      Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E); 
      Color2 = Color.FromArgb(0xFF, 0x83, 0x83, 0x83); 
      Color3 = Color.FromArgb(0xFF, 0x63, 0x63, 0x63); 
      Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); 
      InitializeComponent(); 
      DataContext = this; 
     } 

如果我註釋掉DataContext的分配和使用下面的構造,我的顏色分配不工作,但IsActivePropertyChanged事件觸發的罰款。

public Bin() 
      { 
       Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E); 
       Color2 = Color.FromArgb(0xFF, 0x83, 0x83, 0x83); 
       Color3 = Color.FromArgb(0xFF, 0x63, 0x63, 0x63); 
       Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); 
       InitializeComponent(); 
       //DataContext = this; 
      } 

我的問題是我怎樣才能讓綁定正常工作,並讓我的事件發生。我試圖設置DataContext="{Binding RelativeSource={RelativeSource Self}}"(而不是在後面的代碼中設置DataContext)綁定到XAML中的顏色屬性,一個矩形和一個多邊形的項目,但似乎沒有工作。預先感謝您的幫助。

+1

在編寫自己的控件時,不應該混淆控件本身的'DataContext'。相反,在GradientStop的綁定上,您可以使用'RelativeSource = {RelativeSource AncestorType = Bin}'(假設'Bin'是您的控件)。或者你可以定義一個模板並使用'TemplateBinding'。檢查[這個答案](http://stackoverflow.com/questions/30476263/dependency-property-datacontext/30496202#30496202)我寫了一段時間回類似的問題。 – vesan

+0

_「我的IsActivePropertyChangedEvent永遠不會被解僱」_--那麼沒有人會改變它。不管你真的與你的'DataContext'有什麼關係,都不可能說,因爲你沒有展示如何改變屬性。我可以說,從你發佈的很少的代碼中,似乎你應該使用XAML觸發器來改變顏色值,而不是代碼隱藏。請提供一個很好的[mcve],它可以可靠地重現您的問題,以及該代碼的具體說明以及與您想要的不同之處。 –

+0

我在我的主應用程序中從我的viewModel中更改IsActive屬性。就像我上面所說的那樣,如果我在構造函數中刪除了dataContext行,每次都會觸發,但是當我保留該行時不會觸發。@vesan今天上午我會嘗試這樣做。 – ProgrammingDude

回答

1

編寫自己的控件時,不應該混淆控件本身的DataContext

取而代之,在GradientStop的綁定上,可以使用RelativeSource={RelativeSource AncestorType=Bin}(假設Bin是您的控件)。或者你可以定義一個模板並使用TemplateBinding。檢查this answer我寫了一段時間回到類似的問題 - 它有更詳細的說明如何工作。