Привязка к UserControl в WinRT

Я создал простой пользовательский элемент управления Rating, проблема в том, что этот элемент управления не будет работать в WinRT, когда я использую привязку, он отлично работает на Windows Phone. Это мой элемент управления:

public sealed partial class RatingControl : UserControl
{
    public int Rate { get { return (int)GetValue(RateProperty); } set { SetValue(RateProperty, value); } }
    public static readonly DependencyProperty RateProperty = DependencyProperty.Register("Rate",
                                                                    typeof(int),
                                                                    typeof(RatingControl), null);
    public RatingControl()
    {
        this.InitializeComponent();
        this.Loaded += RatingControl_Loaded;
    }

    void RatingControl_Loaded(object sender, RoutedEventArgs e)
    {
        List<Image> Images = new List<Image>();
        for (int i = 0; i < 5; i++)
        {
            Image img = new Image { Width = 35, Height = 35, Margin = new Thickness(3) };
            img.Source = new BitmapImage { UriSource = new System.Uri("ms-appx:Images/Stars/notFilled.png") };
            Images.Add(img);
            sp.Children.Add(img);
        }
        for (int i = 0; i < Rate; i++)
            Images[i].Source = new BitmapImage { UriSource = new System.Uri("ms-appx:Images/Stars/Filled.png") };
    }
}

Когда я жестко задаю значение, оно работает нормально:

<local:RatingControl Rate="3" />

но когда я использую Binding, он просто показывает ноль звезд. Я проверил значение Rate, оно всегда равно нулю.

<local:RatingControl Rate="{Binding Decor, Mode=TwoWay}" />

ОБНОВЛЕНИЕ: я только что узнал, что привязка происходит до того, как я получу значение скорости, поэтому она все время равна нулю. Как я могу это исправить? Мне нужно, чтобы привязка произошла после того, как я получу значение. Также я думал, что Binding происходит каждый раз, когда я меняю значение Rate.

РЕШЕНИЕ: я не реализовал правильно DependencyObject, я должен был сделать это:

public static readonly DependencyProperty RateProperty = DependencyProperty.Register("Rate",
                                                                    typeof(int),
                                                                    typeof(RatingControl), new PropertyMetadata(0, new PropertyChangedCallback(BindRateControl)));

person Ateik    schedule 06.05.2012    source источник
comment
Каков ваш DataContext? Я думаю, что это может быть вызвано ошибкой привязки. Часто их можно отслеживать в окне вывода/отладки (Ctrl+W,O). Может тип Декора не инт.   -  person Filip Skakun    schedule 07.05.2012
comment
Я проверял, он дает цифры. и тот же код отлично работает на wp7.   -  person Ateik    schedule 07.05.2012
comment
Можете поделиться тестовым проектом? Связывание должно происходить в вызове InitializeComponent или, возможно, вскоре после него. Событие Loaded, скорее всего, произойдет позже. Где вы меняете значение Rate в своем элементе управления?   -  person Filip Skakun    schedule 07.05.2012
comment
не могли бы вы поделиться своим решением? у меня похожая проблема...   -  person Jan K.    schedule 07.05.2012
comment
Я поделился решением, вы найдете его в конце моего вопроса. Если это не поможет, я поделюсь всем кодом   -  person Ateik    schedule 07.05.2012


Ответы (2)


РЕШЕНИЕ: я не реализовал правильно DependencyObject, я должен был сделать это (добавив метод обратного вызова):

public static readonly DependencyProperty RateProperty = DependencyProperty.Register("Rate",
                                                                typeof(int),
                                                                typeof(RatingControl), 
                                                                new PropertyMetadata(0, new PropertyChangedCallback(BindRateControl)));
person Ateik    schedule 12.05.2012

Вы пытались добавить UserControl из кода программной части. это поможет вам убедиться, что UserControl запускается после получения значения.

person LZH    schedule 11.05.2012