2013-08-02 107 views
2

這似乎是一個棘手的問題。至少,這很難描述。我基本上將GridView的itemsSource設置爲對象列表,並且我希望GridView中的每個項都可以訪問它在其自己的代碼中生成的對象。XAML GridView模板綁定到項目

這裏有一些片斷,我希望應該說我的意思:

ReadingPage.xaml.cs

zoomedInGrid.ItemsSource = openChapters.chapters; //A List<BibleChapter> 

ReadingPage.xaml

<GridView x:Name="zoomedInGrid"> 
    <GridView.ItemTemplate> 
     <DataTemplate> 
      <local:ChapterBox Chapter="" /> 
      <!--I have no idea what to put here^^^--> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 

然後在ChapterBox.xaml。 CS我需要訪問BibleChapter模板化的ChapterBox是爲創建的。

任何人都知道如何做到這一點?

編輯

這是我在ChapterBox.xaml.cs:

public static readonly DependencyProperty ChapterProperty = 
    DependencyProperty.Register("Chapter", 
     typeof(BibleChapter), 
     typeof(ChapterBox), 
     null); 

public BibleChapter Chapter 
{ 
    get { return (BibleChapter)GetValue(ChapterProperty); } 
    set { SetValue(ChapterProperty, value); } 
} 

public ChapterBox() 
{ 
    this.InitializeComponent(); 
    VerseRichTextBuilder builder = new VerseRichTextBuilder(); 
    builder.Build(textBlock, Chapter); //<== Chapter is null at this point 
} 

回答

1

依賴屬性添加到ChapterBox類,然後使用一個雙向的XAML綁定:

<local:ChapterBox Chapter="{Binding Mode=TwoWay}" /> 

的DP是這樣的(假設你使用WPF,但它是爲Silverlight類似):

public static readonly DependencyProperty ChapterProperty = 
    DependencyProperty.Register("Chapter", 
     // property type 
     typeof(BibleChapter), 
     // property owner type 
     typeof(ChapterBox), 
     new UIPropertyMetadata(new PropertyChangedCallback(OnChapterChanged))); 

public static void OnChapterChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
{ 
    var chapterBox = (ChapterBox)sender; 

    VerseRichTextBuilder builder = new VerseRichTextBuilder(); 
    var newValue = (Chapter)args.NewValue; 
    builder.Build(chapterBox.textBlock, newValue); 
} 

public BibleChapter Chapter 
{ 
    get { return (BibleChapter)GetValue(ChapterProperty); } 
    set { SetValue(ChapterProperty, value); } 
} 

注意,ChapterProperty DP實際上是綁定,而視圖模型屬性(BibleChapter)是目標。但是,如果您設置Mode=TwoWay,則會導致該屬性更新來自目標的源。

+0

哇,這太簡單了!它似乎應該都可以工作,但在ChapterBox()的構造函數中,Chapter是** null **(上面提到的代碼)。如果它應該在構造函數中爲null,那麼它會在哪一點上發生變化,以及如何使builder.Build()運行一次? –

+0

@MoscowModder你可以使用屬性更改的處理程序 - 參見上面的更新。 – McGarnagle

1

如果Chapter是一個DependencyProperty,那麼你可以簡單地做:

<local:ChapterBox Chapter="{Binding}" /> 

這將設置單個項目的實例綁定到任何Chapter是,顯然,如果類型不是m atch你可以使用轉換器。另外,你應該看一下簡單的設置,用戶控制的DataContext

<local:ChapterBox DataContext="{Binding}" ... />