【问题标题】:DependencyProperty in UserControl not binding in ListItem TemplateUserControl 中的 DependencyProperty 未绑定在 ListItem 模板中
【发布时间】:2013-01-11 02:47:36
【问题描述】:

好几个小时的谷歌搜索和 stakoverflow 阅读,我一直无法找到这个问题的答案。 我有一个UserControl,用于显示ProgressBarDependencyProperty 类型为double

MainPage.XAML.cs 包含DataContext:

void MainPage_Loaded(object sender,RoutedEventArgs e)
{
        setDataContext();
        MainGameListBox.ItemsSource = vm.GameList;
}

这是 MainPage.XAML 中的内容:

<ListBox Grid.Row="1" Grid.ColumnSpan="2" x:Name="MainGameListBox"
         SelectionChanged="listBoxGameSearch_SelectionChanged" >
    <!-- set its ItemsPanel to be a WrapPanel -->
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <toolkit1:WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <toolkit1:ContextMenuService.ContextMenu>
                    <toolkit1:ContextMenu>
                        <toolkit1:MenuItem Header="Pin to start" Click="PinGameToStart_Click" />
                    </toolkit1:ContextMenu>
                </toolkit1:ContextMenuService.ContextMenu>
                <Grid Width="173" Height="173"
                      Background="{StaticResource PhoneAccentBrush}" Margin="12">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="32"/>                                    
                        <RowDefinition Height="32"/>
                        <RowDefinition Height="32"/>
                        <RowDefinition Height="32"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="86.5"/>
                        <ColumnDefinition Width="86.5"/>    
                    </Grid.ColumnDefinitions>
                    <Border Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" Width="64"
                            Height="64" BorderBrush="#70BC1F" BorderThickness="2"
                            Margin="6,6,0,0" VerticalAlignment="Top"
                            HorizontalAlignment="Left">
                        <Image  Source="{Binding GameTile,
                                Converter={StaticResource imageCacheConverter}}" />
                    </Border>
                    <view:CircularProgressChart x:Name="circularProgChart"
                                                Grid.Row="0" Grid.Column="1"
                                                Grid.RowSpan="3" Grid.ColumnSpan="2"
                                                Margin="6"
                                                Loaded="CircularProgressChart_Loaded"
                                                CompletionPercent="{Binding CompletionPercentage}" />
                </Grid>           
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

CompletionPercent 是 DP,UserControl 在下面:

public partial class CircularProgressChart:UserControl
{

    public double CompletionPercent
    {
        get { return (double)GetValue(CompletionPercentProperty); }
        set { SetValue(CompletionPercentProperty, value); }
    }

    public static readonly DependencyProperty CompletionPercentProperty = DependencyProperty.Register("CompletionPercent", typeof(double), typeof(CircularProgressChart), new PropertyMetadata(0.0, CompletionPercentChanged));

    public CircularProgressChart()
    {
        try
        {
            InitializeComponent();
            DataContext = this;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

这是CompletionPercentage 属性:

public class Progress : INotifyPropertyChanged
{ 
    private double _completionPercentage = 0.0;
    public double CompletionPercentage
    {
        get{return _completionPercentage;}
        set{
            _completionPercentage = value;
            NotifyPropertyChanged("CompletionPercentage");
        }
    }
    protected void NotifyPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

问题,为什么是 CompletionPercent="{Binding CompletionPercentage}" 不被束缚?它获取默认值 0,但是当 CompletionPercentage 更新时,DP 不会得到更新。我检查了NotifyPropertyChanged 方法,它可以正确触发并在代码的所有其他部分中工作。

【问题讨论】:

    标签: wpf xaml data-binding dependency-properties


    【解决方案1】:

    原因是CircularProgressChart 构造函数中的DataContext = this 行。 {Binding CompletionPercentage}DataContext 中查找CompletionPercentage 属性,这在CircularProgressChart 中显然不存在。 Progress 类的实例永远不会到达 CircularProgressChart(依赖属性的显式分配优先于绑定)。

    解决方案 1(如果您真的想保留依赖属性):删除 DataContext = this; 行。如果您需要在其 XAML 中绑定到 CircularProgressChart 的属性,请指定正确的绑定源,而不是依赖 DataContext

    解决方案2(从UserControl派生时很常见):完全删除CompletionPercent依赖属性(包括它在MainPage.xaml中的绑定)并直接在CircularProgressChart.xaml中绑定到CompletionPercentage .同时删除DataContext = this; 行。

    解决方案 3(真正的 WPF 方式):使用带有自定义模板的默认 ProgressBar 控件,而不是创建自己的控件。

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 2016-05-13
      • 1970-01-01
      • 2012-06-06
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多