UserControl中的DependencyProperty未在ListItem模板中绑定

时间:2013-01-11 02:47:37

标签: wpf xaml data-binding dependency-properties

好几个小时的谷歌搜索和stakoverflow阅读,我一直无法找到这个问题的答案。 我有一个UserControl,用于显示ProgressBar DependencyProperty类型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方法并且它正确触发并且可以在代码的所有其他部分中使用。

1 个答案:

答案 0 :(得分:0)

原因是DataContext = this构造函数中的CircularProgressChart行。 {Binding CompletionPercentage}CompletionPercentage中查找DataContext属性,CircularProgressChart中显然不存在ProgressCircularProgressChart类的实例永远不会使它成为DataContext = this;的方式(依赖属性的显式赋值优先于绑定)。

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

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

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