2011-12-02 59 views
0

我很可能以错误的方式为UserControl进行数据绑定,请指出我的错误。UserControl DataBinding

我在XAML decleared我的页面视图(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属性。

视图模型临危从逻辑新的数据提出来UI作为BookProgressInfo属性的值,并调用NotifyPropertyChanged("BookProgressInfo");

在这一点上,我希望我的控制处理BookProgressValueChanged事件来更新该控件的自己的数据上下文(基本上是为了得到它绑定的一组更新的条),但BookProgressValueChanged不会在NotifyPropertyChanged之后产生。

主要问题是: 是什么让一个视图有一个DataContext的正确方式,而被置于一个视图中一个用户控件 - 有它自己的,底座上的价值,通过设置dependecy属性databinging?

请让我知道如果问题的解释不清楚,我会改进。谢谢。

+0

您应该检查调试输出窗口,寻找结合例外。如果它没有显示任何内容 - 示例项目可能会有所帮助。 –

+0

可能的重复:[通过属性的ContentControl模板](http://stackoverflow.com/q/8343237/795861) –

回答

0

我认为你应该添加到根格此行:

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

,并添加名称到您的用户控件:

<UserControl x:Name="userControl" 
0

显然,ListBox.ItemsSourceBinding是错误的:在Silverlight中没有'RelativeSource = this'。

ContentControl Template through Property中给出了正确执行此操作的几个选项。请看一看。