2012-07-04 33 views
2

我班的IFrame可以包含其他的IFrame:ItemsControl內的依賴屬性的UserControl:如何將ItemSource的元素綁定到x:UserControl的名稱?

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

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

爲了呈現一個IFrame,我有一個自定義用戶控件:

<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); } }

我的目標:

我想有一個FrameView集合中顯示的每一個IFRAME,例如:

<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.

我如何能實現我的目標是什麼?提前謝謝了。

+0

我已經回答了我的問題,但可以在8小時內才正式回答。在此之前: 所以看來,我的UserControl XAML標籤在依賴屬性發生變化時都是錯誤的。 如果我使用'id =「{Binding Path = Id}」'而不是'x:Name =「」'並從我的UserControl定義中移除'x:Name =「FrameXName」''一切正常 – Caroline

回答

0

在你的DataTemplate你可以用

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

更換

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

應該正常工作

+0

它的確如此,謝謝吉米! – Caroline

相關問題