0

何時間も Google で検索して stakoverflow を読んでも、この問題に対する答えを見つけることができませんでした。タイプの を表示するUserControlために使用される があります。 ProgressBarDependencyPropertydouble

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>

CompletionPercentDP で、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正しく起動し、コードの他のすべての部分で機能します。

4

1 に答える 1

0

理由はコンストラクターのDataContext = thisCircularProgressChartです。でプロパティを{Binding CompletionPercentage}検索しますが、これは明らかにに存在しません。クラスのインスタンスは、 (依存関係プロパティの明示的な割り当てがバインディングよりも優先されます)に到達することはありません。CompletionPercentageDataContextCircularProgressChartProgressCircularProgressChart

解決策1(依存関係プロパティを本当に保持したい場合):DataContext = this;行を削除します。XAML内ののプロパティにバインドする必要がある場合はCircularProgressChart、に依存するのではなく、正しいバインドソースを指定してDataContextください。

解決策2(から派生する場合に非常に一般的):依存関係プロパティを完全にUserControl削除し(のバインディングを含む)、に直接バインドします。また、行を削除します。CompletionPercentMainPage.xamlCompletionPercentageCircularProgressChart.xamlDataContext = this;

解決策3(真のWPF-way):ProgressBar独自のコントロールを作成する代わりに、カスタムテンプレートでデフォルトのコントロールを使用します。

于 2013-01-11T04:05:51.313 に答える