UserControl DataBinding - PullRequest
       1

UserControl DataBinding

0 голосов
/ 02 декабря 2011

Скорее всего, я неправильно выполняю привязку данных для своего UserControl, укажите мне на ошибку.

У меня объявлен UserControl в XAML моего просмотра страницы (view.xaml):

<StackPanel Grid.Row="1" Margin="0,20,0,0" x:Name="ProgressBarPanel" HorizontalAlignment="Center">
                <deusControls:BookProgressBar BookProgressValue="{Binding BookProgressInfo, Mode=OneWay}" Width="430" />
            </StackPanel>

Сам элемент управления является просто упакованным списком (myprogressbar.xaml):

<Grid x:Name="ProgressBarLayoutRoot">

        <ListBox x:Name="ProgressBarControl" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding Bars, RelativeSource=this}">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Height="15" BorderThickness="1" CornerRadius="{Binding Corner}" Width="{Binding Width}" Background="{Binding IsAchieved, Converter={StaticResource progressToColor}}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </Grid>

BookProgressValue зарегистрирован в коде элемента управления как свойство зависимости:

public BookProgressInfo BookProgressValue {
            get { return (BookProgressInfo)GetValue(BookProgressValueProperty); }
            set { SetValue(BookProgressValueProperty, value); }
        }

        public static readonly DependencyProperty BookProgressValueProperty =
            DependencyProperty.Register("BookProgressValue", typeof(BookProgressInfo), typeof(BookProgressBar), 
            new PropertyMetadata(new BookProgressInfo(0), new PropertyChangedCallback(BookProgressValueChanged)));

        static void BookProgressValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var bookProgressBar = (BookProgressBar)sender;

            var progressInfo = (BookProgressInfo) e.NewValue;

            if(progressInfo != null && progressInfo.Id != 0) 
                bookProgressBar.DataContext = new BookProgressBarViewModel(progressInfo, bookProgressBar.Width);
        }

BookProgressValue="{Binding BookProgressInfo, Mode=OneWay}" должен быть привязан к свойству BookProgressInfo в модели представления представлений.

Модель представления получает новые данные из логики для передачи в пользовательский интерфейс в виде значения *Свойство 1017 * и вызывает NotifyPropertyChanged("BookProgressInfo");

. В этот момент я ожидаю, что мой элемент управления обработает событие BookProgressValueChanged, чтобы обновить собственный контекст данных элемента управления (в основном, чтобы получить обновленный набор столбцов, с которыми он связан.) но BookProgressValueChanged не поднимается после NotifyPropertyChanged.

Главный вопрос : Как правильно получить представление, чтобы иметь один DataContext, тогда как UserControl, который помещен в представление - иметь свое собственное, основано на значении длясвойство зависимости, установленное с помощью данных?

Пожалуйста, дайте мне знать, если объяснение вопроса неясно, я улучшу.Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Я думаю, что вы должны добавить в корневую сетку эту строку:

<Grid x:Name="ProgressBarLayoutRoot" 
      DataContext="{Binding ElementName=userControl, BookProgressValue}"

А также добавьте имя в свой UserControl:

<UserControl x:Name="userControl" 
0 голосов
/ 02 декабря 2011

Очевидно, что Binding для ListBox.ItemsSource неверно: в Silverlight нет 'RelativeSource = this'.

Несколько вариантов правильного выполнения этой операции приведены в Шаблон ContentControl через свойство . Пожалуйста, посмотрите.

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