2012-05-30 171 views
0

我遇到了一個問題,我的應用程序無法通過它。我創建了以下簡單的WPF應用程序來說明情況。WPF綁定和DataTemplate

MainWindow.xaml:

<Window x:Class="GlobalDataTemplate.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:my="clr-namespace:GlobalDataTemplate" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type my:MyData}"> 
      <StackPanel Background="{Binding BgColor}"> 
       <TextBlock Text="{Binding Text}"/> 
       <TextBlock Text="{Binding Number}"/> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 
    <ItemsControl> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Columns="3" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <my:MyData x:Name="NW" Text="NW" Number="1" BgColor="#FFFF0000" /> 
     <my:MyData x:Name="N" Text="N" Number="2" BgColor="#FF63FF00" /> 
     <my:MyData x:Name="NE" Text="NE" Number="3" BgColor="#FFFFCA00" /> 
     <my:MyData x:Name="W" Text="W" Number="4" BgColor="#FF0037FF" /> 
     <my:MyData x:Name="C" Text="C" Number="5" BgColor="#FF9E00FF" /> 
     <my:MyData x:Name="E" Text="E" Number="6" BgColor="#FF838383" /> 
     <my:MyData x:Name="SW" Text="SW" Number="7" 
        BgColor="{Binding ElementName=NW, Path=BgColor}" /> 
     <my:MyData x:Name="S" Text="S" Number="8" 
        BgColor="{Binding ElementName=N, Path=BgColor}" /> 
     <my:MyData x:Name="SE" Text="SE" Number="9" 
        BgColor="{Binding ElementName=NE, Path=BgColor}" /> 
    </ItemsControl> 
</Window> 

MyData.cs:

using System.Windows; 
using System.Windows.Media; 

namespace GlobalDataTemplate 
{ 
    class MyData : DependencyObject 
    { 
     public string Text 
     { 
      get { return (string)GetValue(TextProperty); } 
      set { SetValue(TextProperty, value); } 
     } 
     public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register("Text", typeof(string), typeof(MyData), new UIPropertyMetadata(null)); 

     public int Number 
     { 
      get { return (int)GetValue(NumberProperty); } 
      set { SetValue(NumberProperty, value); } 
     } 
     public static readonly DependencyProperty NumberProperty = 
      DependencyProperty.Register("Number", typeof(int), typeof(MyData), new UIPropertyMetadata(0)); 

     public Brush BgColor 
     { 
      get { return (Brush)GetValue(BgColorProperty); } 
      set { SetValue(BgColorProperty, value); } 
     } 
     // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty BgColorProperty = 
      DependencyProperty.Register("BgColor", typeof(Brush), typeof(MyData), new UIPropertyMetadata(null)); 
    } 
} 

從XAML,你希望看到在底部相同的顏色一個3x3的網格,在頂部顯示。但底部行的顏色根本沒有顯示(您會看到窗口的白色背景)。我怎樣才能讓底部的顏色正確地綁定到頂部的顏色?

我也嘗試添加屬性更改處理程序並設置斷點。斷點不會被擊中。

在此先感謝。

+0

我假設沒有顏色? – CodingGorilla

+0

您可能還需要在UniformGrid上設置Rows屬性: Ross

+0

@CodingGorilla,本質上是,它們是無色的。正如我所提到的,你會看到窗口的白色背景。 – gregsdennis

回答

1

當我運行代碼,我得到的調試輸出此錯誤消息:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=BgColor; DataItem=null; target element is 'MyData' (HashCode=65325907); target property is 'BgColor' (type 'Brush')

即這意味着WPF不會將MyData項目視爲邏輯樹的一部分。 因此,從Freezable導出MyData,例如,

class MyData : Freezable 
{ 
    protected override Freezable CreateInstanceCore() 
    { 
     throw new System.NotImplementedException(); 
    } 

    ... put the dependency properties here ... 

} 

「無法找到治理FrameworkElement ...」問題與「繼承上下文」有關;請在這裏找到詳細信息:http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx

+0

謝謝你。我今天學到了東西。奇蹟般有效! – gregsdennis