繁体   English   中英

UserControl数据绑定

[英]UserControl DataBinding

我很可能以错误的方式为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属性。

视图模型从逻辑中接收新数据,并将其作为BookProgressInfo属性的值提交给UI,并调用NotifyPropertyChanged("BookProgressInfo");

此时,我期望控件处理BookProgressValueChanged事件以更新控件自己的数据上下文(基本上是获取绑定到的一组更新的Bar。),但是BookProgressValueChanged之后不会引发NotifyPropertyChanged

主要问题是 :使视图具有一个DataContext的正确方法什么,而放置在视图内部的UserControl(拥有自己的控件)基于通过数据连接设置的Dependecy属性的值呢?

如果问题的解释不清楚,请告诉我,我会改善的。 谢谢。

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

通过PropertyContentControl模板中提供了一些正确执行此操作的选项。 请看一看。

我认为您应该将以下行添加到根网格中:

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

并将名称添加到您的UserControl中:

<UserControl x:Name="userControl" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM