2

我的类 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>

使用代码隐藏:

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 中显示框架: <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.

我怎样才能实现我的目标?提前谢谢了。

4

1 回答 1

0

在您的数据模板中,您可以替换

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

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

应该可以正常工作

于 2012-07-04T22:05:50.267 回答