Wpf 为什么多重绑定总是为第一个值传递DependencyProperty.UnsetValue?
在WPF应用程序中的一个表单中,我正在构建一个psuedo条形图。条形图由具有12列的网格组成。每列包含一个矩形。我使用数据绑定将矩形的高度绑定到要绘制的数据。xaml如下所示:Wpf 为什么多重绑定总是为第一个值传递DependencyProperty.UnsetValue?,wpf,data-binding,binding,Wpf,Data Binding,Binding,在WPF应用程序中的一个表单中,我正在构建一个psuedo条形图。条形图由具有12列的网格组成。每列包含一个矩形。我使用数据绑定将矩形的高度绑定到要绘制的数据。xaml如下所示: <Border BorderBrush="{DynamicResource ControlBorder}" BorderThickness="2" Grid.Column="1" Grid.Row="0" Margin="0,5" N
<Border BorderBrush="{DynamicResource ControlBorder}"
BorderThickness="2"
Grid.Column="1"
Grid.Row="0"
Margin="0,5"
Name="SNRGraphBorder">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Rectangle Fill="{DynamicResource TextForeground}"
Grid.Column="0"
Margin="1,5,2,0"
Name="Data01"
VerticalAlignment="Bottom">
<Rectangle.Height>
<MultiBinding Converter="{StaticResource ScaleData}">
<Binding Source="{StaticResource XmlProvider}"
XPath="a:PathToData}" />
<Binding Path="RectangleHeight"
RelativeSource="{RelativeSource AncestorType={x:Type cs:MyControl}}" />
</MultiBinding>
</Rectangle.Height>
</Rectangle>
. . .
</Grid>
</Border>
最后,下面是此控件的代码:
public partial class MyControl : UserControl {
public XmlDataProvider DataProvider { get; set; }
public DeviceMonitor DeviceMonitor { get; set; }
public double RectangleHeight {
get { return SNRGraphBorder.ActualHeight; }
}
public MyControl() {
InitializeComponent();
DataProvider = Resources[ "XmlProvider" ] as XmlDataProvider;
}
private void GetDiagnosticsInfo() {
if ( DeviceMonitor != null ) {
XmlDocument diagnosticsDoc = new XmlDocument();
string info = DeviceMonitor.GetDiagnosticInfo();
diagnosticsDoc.LoadXml( info );
DataProvider.Document = diagnosticsDoc;
}
}
private void RefreshButton_Click( object sender, RoutedEventArgs e ) {
GetDiagnosticsInfo();
e.Handled = true;
}
}
我在转换器的if(值[0]是字符串)
行中设置了断点。我看到values数组中的第一个条目总是dependencProperty.UnsetValue。然而,我知道XML还有其他关于这个属性的数据。我做错了什么
谢谢
托尼我已经解决了这个问题。如果仔细查看第一个多重绑定中的XPath,就会发现它以“}”结尾。该字符实际上不是XPath的一部分,它是使用{binding Source={…}XPath=}语法的单个绑定时绑定的原始文本的遗留部分。一旦删除它,我就停止获取值数组中第一个值的
dependencProperty.UnsetValue
我还解决了另一个问题,第二个值为零。我将RectangleHeight属性设置为一个DependencyProperty
,并在加载的事件处理程序中添加了代码,以将其设置为包含所有矩形的网格
控件的实际高度。现在我的代码工作了,我得到了一个可爱的条形图
感谢所有查看的人。您是否向资源中添加了键为“XmlProvider”的XmlDataProvider?您确定“a:PathToData}”是正确的吗?是一个括号吗?是的,我确实在资源中添加了键为“XmlProvider”的XmlDataProvider。我只是没有在示例中显示它。我的XPath是正确的:我有一个早期版本的代码,没有IMultiBinding和IMultConverter,我能够看到该版本中的数据。问题是在每次调用IMultiConverter时,第一个参数总是dependencProperty.UnsetValue.hm。。有意思。。“矩形高度”在“IMultiValueConverter”中的值是否正确?是。它正好是0,因为我还没有设置它,但我仍然看到DependencyProperty.UnsetValue始终用于第一个绑定。这就是我试图解决的问题。此外,添加在SizeChanged事件中设置RectangleHeight的代码,使之成为多年后发生在我身上的相同事情,只是使用了相对资源绑定。我检查了RelativeSource绑定的语法是否错误,但没有考虑检查语法的路径。最后去掉多余的}终于解决了这个问题。
public partial class MyControl : UserControl {
public XmlDataProvider DataProvider { get; set; }
public DeviceMonitor DeviceMonitor { get; set; }
public double RectangleHeight {
get { return SNRGraphBorder.ActualHeight; }
}
public MyControl() {
InitializeComponent();
DataProvider = Resources[ "XmlProvider" ] as XmlDataProvider;
}
private void GetDiagnosticsInfo() {
if ( DeviceMonitor != null ) {
XmlDocument diagnosticsDoc = new XmlDocument();
string info = DeviceMonitor.GetDiagnosticInfo();
diagnosticsDoc.LoadXml( info );
DataProvider.Document = diagnosticsDoc;
}
}
private void RefreshButton_Click( object sender, RoutedEventArgs e ) {
GetDiagnosticsInfo();
e.Handled = true;
}
}