0

長いプロパティを公開するユーザーコントロールがあります。このコントロールをインスタンス化し、データテンプレートの公開されたプロパティにバインドしたいと思います。

リソースファイルにxamlエラーが表示されています。あいまいな「ルート要素としてパネルの派生物が必要です」。そして、これをデバッガーで実行すると、TeamIdxの値が-1であり、設定されていないことがわかります。

<DataTemplate x:Key="TeamScheduleTemplate">
    <Grid HorizontalAlignment="Left" Width="400" Height="600">
        <Team:ScheduleControl TeamIdx="{Binding Idx}" />
    </Grid>
</DataTemplate>



public sealed partial class ScheduleControl : UserControl
{
    public static readonly DependencyProperty TeamIdxProperty =
        DependencyProperty.Register(
        "TeamIdx",
        typeof(long),
        typeof(ScheduleControl),
        new PropertyMetadata((long)-1));

    public long TeamIdx
    {
        get { return (long)GetValue(TeamIdxProperty); }
        set { SetValue(TeamIdxProperty, value); }
    }

    public ScheduleControl()
    {
        this.InitializeComponent();

        var team = TeamLookup.GetTeam(TeamIdx);
    }
}
4

1 に答える 1

0

編集:コントロールが構築されるまで、バインディングは発生しないことがわかりました。振り返ってみると、これは完全に理にかなっています。私が使用した解決策は以下のとおりです。

public sealed partial class ScheduleControl : UserControl
{
    public static readonly DependencyProperty TeamIdxProperty =
        DependencyProperty.Register(
        "TeamIdx",
        typeof(long),
        typeof(ScheduleControl),
        new PropertyMetadata(
            (long)-1,
            OnTeamIdxChanged));

    public long TeamIdx
    {
        get { return (long)GetValue(TeamIdxProperty); }
        set { SetValue(TeamIdxProperty, value); }
    }

    private static void OnTeamIdxChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var target = (ScheduleControl)sender;
            target.OnTeamIdxChanged((long)e.NewValue);
    }

    private void OnTeamIdxChanged(long id)
    {
        var model = FindModel(id);
        this.DataContext = model;
    }


    public ScheduleControl()
    {
        this.InitializeComponent();
    }
}
于 2013-01-03T20:02:35.153 に答える