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 回答