Список элементов Silverlight ItemTemplate Привязка управления пользователем - PullRequest
1 голос
/ 12 февраля 2012

Здесь я почесываю свой мозг ....

У меня есть следующий ListBox

    <ListBox Height="221" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="Auto" ItemsSource="{Binding MediaItems}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid ShowGridLines="True">
                    <my:MediaItemControl CurrentItem="{Binding}" />

                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ListBox>

Список привязан к ObservableCollection объекта.

Как выможно увидеть этот ListBox включает в себя пользовательский элемент управления.В пользовательском элементе управления у меня есть следующая информация о свойствах зависимости:

    public static readonly DependencyProperty CurrentItemProperty = DependencyProperty.Register("CurrentItem", typeof(TypedMediaItem), typeof(MediaItemControl), new PropertyMetadata(null));
    public TypedMediaItem  CurrentItem
    {
        get { return (TypedMediaItem)GetValue(MediaItemControl.CurrentItemProperty); }
        set { 
            SetValue(MediaItemControl.CurrentItemProperty, value);
        }
    }

Я пытаюсь передать текущий элемент из ItemsSource объекта ListBox в мой usercontrol.Однако использование вышеуказанных методов не работает, никогда не вызывается установщик свойства зависимости.

Что я делаю не так?

1 Ответ

3 голосов
/ 12 февраля 2012

Все, что связано с DependencyProperty, не будет напрямую вызывать созданное вами свойство CLR. Чтобы на самом деле узнать, изменился ли DependencyProperty, вам нужно создать PropertyChangedCallback, как показано ниже.

//Never used by xaml that binds to CurrentItem
//Only used when referenced directly by C# code
//Example: (obj as MediaItemControl).CurrentItem = new TypedMediaItem();
public TypedMediaItem CurrentItem{
    get { return (TypedMediaItem) GetValue(CurrentItemProperty ); }
    set { SetValue(CurrentItemProperty , value); }
}

//Used by xaml binding
public static readonly DependencyProperty CurrentItemProperty =
   DependencyProperty.Register("CurrentItem", typeof(TypedMediaItem),
   typeof(MediaItemControl), new PropertyMetadata(null, new PropertyChangedCallback(OnCurrentItemChanged)));

private static void OnCurrentItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
    //TODO: Set break point here
    //If this code is executed, then the property was changed
    MediaItemControl instance = (MediaItemControl) d;
    TypedMediaItem newValue = (TypedMediaItem) e.NewValue;
    return;
}

Это не дает точного ответа на ваш вопрос, но должно помочь вам отладить немного дальше. Если вы все еще не можете понять, что не так, то я собираюсь получить больше информации, потому что все, что вы предоставили, выглядит для меня правильно. Например, ошибка, которую вы получаете или больше кода на MediaItemControl. Вы также можете загрузить проект куда-нибудь, и я смогу посмотреть на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...