2013-08-02 2 views
2

Это кажется сложным. По крайней мере, сложно описать.Шаблон XAML GridView привязан к элементу

В основном, я устанавливаю itemsSource GridView в список объектов, и я хочу, чтобы каждый элемент в 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 Мне нужно иметь доступ к Библии, которая была создана для шаблона ChapterBox.

Кто-нибудь знает, как это сделать?

EDIT

Это то, что я имею в 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}" /> 

ДП будет выглядеть следующим образом (предположим, что вы используете 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() глава ** null ** (код введен в вопросе выше). Если в конструкторе предполагается, что он является нулевым, то в какой момент он изменится и как я могу сделать builder.Build() запущенным, как только это произойдет? –

+0

@MoscowModder вы, вероятно, можете использовать обработчик с изменением свойства для этого - см. Обновление выше. – McGarnagle

1

Если Chapter является DependencyProperty, то вы можете просто сделать:

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

Этот установит экземпляр отдельного элемента, связанного с тем, что Chapter, очевидно, если типы не являются m вы можете использовать конвертер. Кроме того, вы, вероятно, следует смотреть на просто установив DataContext пользовательского элемента управления:

<local:ChapterBox DataContext="{Binding}" ... /> 
Смежные вопросы