2013-01-11 45 views
0

好幾個小時的谷歌搜索和stakoverflow閱讀,我一直無法找到這個問題的答案。 我有一個UserControl用於顯示一個ProgressBarDependencyProperty類型doubleUserControl中的DependencyProperty不能綁定在ListItem模板中

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方法,它正確觸發並在代碼的所有其他部分工作。

回答

0

原因是DataContext = thisCircularProgressChart的構造函數。 {Binding CompletionPercentage}尋找CompletionPercentage物業DataContext,這顯然不存在於CircularProgressChartProgress類的實例永遠不會使它進入CircularProgressChart(顯式賦值依賴項屬性的優先級高於綁定的優先級)。

解決方案1 ​​(如果您確實想保留依賴項屬性):刪除DataContext = this;行。如果您需要綁定到其XAML中的CircularProgressChart的屬性,請指定正確的綁定源,而不是依賴於DataContext

溶液2(從UserControl導出時很常見):完全除去CompletionPercent依賴屬性(包括其在MainPage.xaml結合),並直接在CircularProgressChart.xaml結合CompletionPercentage。同時刪除DataContext = this;一行。

解決方案3(真正的WPF方式):使用默認的ProgressBar控件與自定義模板,而不是創建自己的控件。

相關問題