如何将ItemsControl绑定到usercontrol的依赖项属性?

时间:2014-12-06 21:03:41

标签: wpf xaml itemscontrol

试图更好地理解这一点。

我在我的主视图中定义了一个ItemsControl 这样的

<ItemsControl  Grid.Column="0" Grid.Row="2"
                   ItemsSource="{Binding Notes}" 
                   ItemTemplate="{Binding Source={StaticResource MyParagraph}}"
  >

</ItemsControl> 

我想使用DataTemplate:

<UserControl.Resources>
    <DataTemplate x:Key="MyParagraph">
        <v:InkRichTextView
            RichText="{Binding ?????? "
     </DataTemplate>
</UserControl.Resources>

InkRichTextView是一个带有依赖项属性RichText的视图,用于将主视图中ObservableCollection(InkRichViewModel)Notes的段落传递给用户控件。也就是说,这适用于一个段落:

<v:InkRichTextView RichText ="{Binding Path=Note}" Grid.Column="0" Grid.Row="0" />

其中Note被定义为MainView中的段落。

问题是,如何编写DataTemplate和ItemsControl,以便ItemsControl可以将每个段落从observablecollection传递到InkRichTextView中的依赖项属性RichText?

感谢您提供任何指导。 (我希望这是可以理解的!)

3 个答案:

答案 0 :(得分:1)

根据您的描述,ItemsControl中的每个项似乎都是一个段落,即您要分配给InkRichTextView.RichText属性的对象。这是对的吗?

如果是这样,请记住,在项模板中,数据上下文是集合项本身 - 因此,您要查找的路径不是指数据上下文的属性,而是指数据上下文本身。

这是通过点(.)路径完成的:

<v:InkRichTextView RichText="{Binding .}"/>

答案 1 :(得分:1)

物品控制:

    <ItemsControl x:Name="NotesItemsControl" Grid.Column="2" HorizontalAlignment="Center">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <local:InkRichTextView RichText="{Binding Note}"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

代码背后:

    class InkRichViewModel : System.ComponentModel.INotifyPropertyChanged
    {
        #region Note (INotifyPropertyChanged Property)
        private string _note;

        public string Note
        {
            get { return _note; }
            set
            {
                if (_note != value)
                {
                    _note = value;
                    RaisePropertyChanged("Note");
                }
            }
        }
        #endregion

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string p)
        {
            var propertyChanged = PropertyChanged;
            if (propertyChanged != null)
            {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(p));
            }
        }
    }


    public MainWindow()
    {
        InitializeComponent();

        var item01 = new InkRichViewModel() { Note = "Note 01", };
        var item02 = new InkRichViewModel() { Note = "Note 02", };
        var item03 = new InkRichViewModel() { Note = "Note 03", };
        var item04 = new InkRichViewModel() { Note = "Note 04", };
        var item05 = new InkRichViewModel() { Note = "Note 05", };
        var itemList = new List<InkRichViewModel>() 
        {
            item01, item02, item03, item04, item05,
        };
        NotesItemsControl.ItemsSource = itemList;

    }

它如何看待运行时:

How it looks at runtime

这就是你要找的东西吗?

答案 2 :(得分:0)

我发布这个作为答案,虽然归功于O.R.Mapper和Murven指出我正确的方向。我的帖子是帮助其他人学习这个。

简单来说,ItemControl在其ItemsSource中对集合执行循环操作。在我的例子中,ItemsSource是InkRichViewModel类型的集合。 (因此来自Murven的问题)。在循环操作中,ItemsSource将从InkRichViewModel创建对象。 (因此,我的usercontrol现在有一个单独的datacontext!)这些对象中的每一个都将使用ItemTemplate进行显示。因此,为了简化操作,我将DataTemplate从UserControl资源移动到ItemControl本身,如下所示:

  <ItemsControl  Grid.Column="0" Grid.Row="2"
                   ItemsSource="{Binding Notes}" 
                   >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <v:InkRichTextView RichText="{Binding Note}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

现在我的每个用户控件都有自己的ItemsControl分配的datacontext,输出窗口(VS2010)现在显示绑定错误。修复这些错误会导致工作解决方案。

希望这有助于像我这样的其他新手。谢谢大家。

(哎呀!刚刚看到了Murven的回答,但是如果它有助于某人理解,我会离开这个。)