XAML GridView模板绑定到项目

时间:2013-08-02 04:33:38

标签: c# xaml gridview data-binding

这看起来很棘手。至少,描述起来很棘手。

基本上,我将GridView的itemsSource设置为对象列表,我希望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
}

2 个答案:

答案 0 :(得分:1)

如果Chapter是DependencyProperty,那么您可以执行以下操作:

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

这会将单个项目的实例设置为绑定到Chapter的任何内容,显然如果类型不匹配,则可以使用转换器。或者,您可能只需要设置用户控件的DataContext

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

答案 1 :(得分: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时,会导致该属性更新目标源。