2016-08-25 15 views
0

CommandBarのように少し動作するコントロールを作成します。
はあなたが書くことができますコマンドバーを使用する:XAMLを使用してUserControl内のItemsControlにコントロールを追加する

<CommandBar> 
    <CommandBar.PrimaryCommands> 
     <AppBarButton>B1</AppBarButton> 
     <AppBarButton>B2</AppBarButton> 
    </CommandBar.PrimaryCommands> 
</CommandBar> 


私のコントロールも、XAMLの中に追加することができるコントロールする特性を有しています。このよう

<Page 
    x:Class="TheApp.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="using:App27" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <local:MyControl> 
      <local:MyControl.LeftStuff> 
       <Button>L1</Button> 
       <Button>L2</Button> 
      </local:MyControl.LeftStuff> 
      <local:MyControl.MidStuff> 
       <Button>M1</Button> 
       <Button>M2</Button> 
      </local:MyControl.MidStuff> 
      <local:MyControl.RightStuff> 
       <Button>R1</Button> 
       <Button>R2</Button> 
      </local:MyControl.RightStuff> 
     </local:MyControl> 
    </Grid> 
</Page> 


は、これまでのところ私は、次のユーザーコントロールを作ってみました。
MyControl.xaml:

<UserControl 
    x:Class="TheApp.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="using:App27" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    d:DesignHeight="300" 
    d:DesignWidth="400" 
    mc:Ignorable="d"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <ItemsControl Grid.Column="0" ItemsSource="{x:Bind LeftStuff}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
     <ItemsControl Grid.Column="1" ItemsSource="{x:Bind MidStuff}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
     <ItemsControl Grid.Column="2" ItemsSource="{x:Bind RightStuff}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Grid> 
</UserControl> 

MyControl.xaml.cs:

namespace TheApp 
{ 
    using System.Collections.ObjectModel; 
    using Windows.UI.Xaml; 
    using Windows.UI.Xaml.Controls; 

    public sealed partial class MyControl: UserControl 
    { 
     public MyControl() 
     { 
      this.InitializeComponent(); 
     } 

     public static readonly DependencyProperty LeftStuffProperty = 
      DependencyProperty.Register("LeftStuff", typeof(ObservableCollection<FrameworkElement>), typeof(MyControl), new PropertyMetadata(null)); 

     public ObservableCollection<FrameworkElement> LeftStuff 
     { 
      get { return (ObservableCollection<FrameworkElement>)GetValue(LeftStuffProperty); } 
      set { SetValue(LeftStuffProperty, value); } 
     } 

     public static readonly DependencyProperty MidStuffProperty = 
      DependencyProperty.Register("MidStuff", typeof(ObservableCollection<FrameworkElement>), typeof(MyControl), new PropertyMetadata(null)); 

     public ObservableCollection<FrameworkElement> MidStuff 
     { 
      get { return (ObservableCollection<FrameworkElement>)GetValue(MidStuffProperty); } 
      set { SetValue(MidStuffProperty, value); } 
     } 

     public static readonly DependencyProperty RightStuffProperty = 
      DependencyProperty.Register("RightStuff", typeof(ObservableCollection<FrameworkElement>), typeof(MyControl), new PropertyMetadata(null)); 

     public ObservableCollection<FrameworkElement> RightStuff 
     { 
      get { return (ObservableCollection<FrameworkElement>)GetValue(RightStuffProperty); } 
      set { SetValue(RightStuffProperty, value); } 
     } 
    } 
} 


これは、コンパイルされ、デザイナーで期待どおりメインページがレンダリングされます。 MyControl as rendered in designer

しかし、私は、コードを実行したときに、私はこの例外を取得:

タイプの例外が「Windows.UI.Xaml.Markup.XamlParseException」App27.exeで発生したが、ユーザーコードで処理されませんでした WinRT情報: 'Windows.UI.Xaml.Controls.Button'タイプのインスタンスを 'System.Collections.ObjectModel.ObservableCollection`1'のコレクションに追加できません。 [行:16位置:13] ...

何が間違っていますか?

答えて

1

質問に答えるために自分自身:

を依存関係プロパティはXAMLは要素を追加できるように初期化する必要があります。

public static readonly DependencyProperty ...StuffProperty = 
    DependencyProperty.Register(
     "...Stuff", 
     typeof(ObservableCollection<FrameworkElement>), 
     typeof(MyControl), 
     // The property needs to be initialized 
     new PropertyMetadata(new ObservableCollection<FrameworkElement>()) 
    ); 
関連する問題