好几个小时的谷歌搜索和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
方法并且它正确触发并且可以在代码的所有其他部分中使用。
答案 0 :(得分:0)
原因是DataContext = this
构造函数中的CircularProgressChart
行。 {Binding CompletionPercentage}
在CompletionPercentage
中查找DataContext
属性,CircularProgressChart
中显然不存在Progress
。 CircularProgressChart
类的实例永远不会使它成为DataContext = this;
的方式(依赖属性的显式赋值优先于绑定)。
解决方案1 (如果您确实要保留依赖项属性):删除CircularProgressChart
行。如果您需要在其XAML中绑定DataContext
的属性,请指定正确的绑定源,而不是依赖UserControl
。
解决方案2 (从CompletionPercent
派生时非常常见):完全删除MainPage.xaml
依赖项属性(包括其在CompletionPercentage
中的绑定)并绑定到{{ 1}}直接在CircularProgressChart.xaml
。同时删除DataContext = this;
行。
解决方案3 (真正的WPF方式):使用默认ProgressBar
控件和自定义模板,而不是创建自己的控件。