【问题标题】:UserControl DataBinding用户控件数据绑定
【发布时间】: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


【解决方案1】:

我认为您应该将此行添加到根网格:

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

并且还将名称添加到您的 UserControl:

<UserControl x:Name="userControl" 

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2012-03-29
      相关资源
      最近更新 更多