试图更好地理解这一点。
我在我的主视图中定义了一个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?
感谢您提供任何指导。 (我希望这是可以理解的!)
答案 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;
}
它如何看待运行时:
这就是你要找的东西吗?
答案 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的回答,但是如果它有助于某人理解,我会离开这个。)