在ItemsControl中使用Dependency属性的UserControl:如何将ItemSource的元素绑定到x:UserControl的名称?

时间:2012-07-04 14:59:04

标签: c# wpf dependency-properties itemscontrol caliburn.micro

我的班级IFrame可以包含其他IFrame:

public interface IFrame
{
    int Id { get; }
    string Summary { get; }

    BindableCollection<IFrame> SubFrames { get; set; }
}

要呈现IFrame,我有一个自定义的UserControl:

<UserControl x:Class="Views.FrameView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:Views="clr-namespace:Views"
         mc:Ignorable="d" 
         x:Name="FrameXName">
    <StackPanel Orientation="Horizontal">
        <Label Content="{Binding ElementName=FrameXName, Path=Id}" Width="50"/>
    </StackPanel>
</UserControl>

使用codebehind:

public partial class FrameView : UserControl
{
    public FrameView()
    {
        InitializeComponent();
    }

    public static DependencyProperty IdProperty = DependencyProperty.Register(
        "Id", typeof(int), typeof(FrameView));

    public int Id
    {
        get { return (int) GetValue(IdProperty); }
        set { SetValue(IdProperty, value); }
    }
}

因此我可以使用以下方法在FooView.xaml中显示一个Frame:    <Views:FrameView x:Name="Frame1" Width="50" Height="50"/>如果我在FooViewModel.cs中定义以下内容:    public IFrame Frame1 { get { return Frames.ElementAt(1); } }

我的目标:

我希望为集合中的每个IFrame显示一个FrameView,例如:

<ItemsControl ItemsSource="{Binding Frames}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Views:FrameView x:Name="{Binding}" Width="50" Height="50"/>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
</ItemsControl>

定义public BindableCollection<IFrame> Frames的地方。

不幸的是,这不起作用,编译器说MarkupExtensions are not allowed for Uid or Name property values, so '{Binding}' is not valid.

我如何实现目标?非常感谢提前。

1 个答案:

答案 0 :(得分:0)

在您的datatemplate中,您可以替换

<Views:FrameView x:Name="{Binding}" Width="50" Height="50" />

<Views:FrameView Id="{Binding Path=Id}" Width="50" Height="50" />

应该可以正常工作