【发布时间】:2011-12-02 00:14:30
【问题描述】:
很可能我以错误的方式为我的 UserControl 进行数据绑定,请指出错误。
我在我的页面视图 (view.xaml) 的 XAML 中取消了 UserControl:
<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 属性。
视图模型从逻辑中接收到一个新数据作为BookProgressInfoproperty的值提交给UI,并调用NotifyPropertyChanged("BookProgressInfo");
此时我希望我的控件能够处理 BookProgressValueChanged 事件以更新控件自己的数据上下文(基本上是为了获取它绑定到的一组更新的 Bars。)但在 @987654332 之后不会引发 BookProgressValueChanged @。
主要问题是: 让视图拥有一个 DataContext 的正确方法是什么,而放置在视图内的 UserControl - 拥有它自己的,基于通过数据绑定设置的依赖属性的值?
如果问题的解释不清楚,请告诉我,我会改进。谢谢。
【问题讨论】:
-
您应该检查调试输出窗口以查找绑定异常。如果它没有显示任何内容 - 示例项目可能会有所帮助。
标签: .net silverlight windows-phone-7 data-binding