Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么多重绑定总是为第一个值传递DependencyProperty.UnsetValue?_Wpf_Data Binding_Binding - Fatal编程技术网

Wpf 为什么多重绑定总是为第一个值传递DependencyProperty.UnsetValue?

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

在WPF应用程序中的一个表单中,我正在构建一个psuedo条形图。条形图由具有12列的网格组成。每列包含一个矩形。我使用数据绑定将矩形的高度绑定到要绘制的数据。xaml如下所示:

<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;
    }
}