我正在尝试使用Expression Blend 4在Silverlight 4中的UserControl中创建一个intertia touch滚动列表。我已经在我的UserControl中创建了依赖项属性,我想像ListBox那样工作。 ItemSource是我想在列表中显示的对象列表,datatemplate是它应该显示的方式。
如何在UserControl中处理这些属性?我有一个StackPanel,其中应添加所有数据窗口,显示数据ofc。
当循环通过ItemSource将它们添加到列表(StackPanel)时,如何将我的IEnumerable中的数据应用于DataTemplate。
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(InertiaScrollBox), null);
public IEnumerable ItemsSource
{
get{ return (IEnumerable)GetValue(ItemsSourceProperty); }
set{ SetValue(ItemsSourceProperty, value); }
}
public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(InertiaScrollBox), null);
public DataTemplate ItemTemplate
{
get { return (DataTemplate)GetValue(ItemTemplateProperty); }
set { SetValue(ItemTemplateProperty, value); }
}
这有点难以解释,但希望你能理解,否则请问。提前致谢
答案 0 :(得分:1)
如果不处理更改,依赖属性就没用了。
首先,您应该添加PropertyChanged回调。在我的示例中,我将它们内联添加并调用UpdateItems
私有方法。
public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(InertiaScrollBox),
new PropertyMetadata((s, e) => ((InertiaScrollBox)s).UpdateItems()));
public static readonly DependencyProperty ItemTemplateProperty =
DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(InertiaScrollBox),
new PropertyMetadata((s, e) => ((InertiaScrollBox)s).UpdateItems()));
然后,您可以调用LoadContent
类的DataTemplate
方法,并将ItemsSource
中的项目作为DataContext设置为返回的可视元素:
private void UpdateItems()
{
//Actually it is possible to use only the ItemsSource property,
//but I would rather wait until both properties are set
if(this.ItemsSource == null || this.ItemTemplate == null)
return;
foreach (var item in this.ItemsSource)
{
var visualItem = this.ItemTemplate.LoadContent() as FrameworkElement;
if(visualItem != null)
{
visualItem.DataContext = item;
//Add the visualItem object to a list or StackPanel
//...
}
}
}