Скорее всего, я неправильно выполняю привязку данных для своего 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, который помещен в представление - иметь свое собственное, основано на значении длясвойство зависимости, установленное с помощью данных?
Пожалуйста, дайте мне знать, если объяснение вопроса неясно, я улучшу.Спасибо.