WPF XAML绑定不调用已更改的事件

时间:2015-07-13 16:08:32

标签: c# wpf xaml binding

我的程序有一个自定义的DependencyObject,我绑定了另一个DependencyObject的值,它们在代码中设置:

    <TabControl
        Grid.Column="1"
        Grid.Row="1">
        <TabItem
            Header="XML">
            <TextBox
                Text="{Binding Asset.Xml, ElementName=window}"
                IsReadOnly="True" />
        </TabItem>
        <TabItem
            Header="Texture">
            <we:DXImage>
                <we:DXImage.Renderer>
                    <we:TextureRenderer
                        Source="{Binding Asset.Image, ElementName=window}" />
                </we:DXImage.Renderer>
            </we:DXImage>
        </TabItem>
    </TabControl>

与Asset.Xml的TextBox绑定完美无缺,如果我用TextBox替换第二项的xaml,它还会显示Asset.Image(string类型的图像的路径)的内容。 渲染器的Source属性如下所示:

    private static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(string), typeof(TextureRenderer),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, SourceChanged));

    public string Source
    {
        get { return (string)GetValue(SourceProperty); }
        set { SetValue(SourceProperty, value); }
    }

    private static void SourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        // Do stuff
    }

但是从不调用SourceChanged事件。

我在GitHub上更新了项目: https://github.com/Qibbi/WrathEd/tree/master/WrathEd2 xaml代码位于WrathEd2项目中,而DXImage,Renderer和其他支持类位于WrathEd.Windows中 当前的MainWindow背后是一个混乱的代码,我计划在完成项目时将其重构为适当的部分。

2 个答案:

答案 0 :(得分:0)

问题是你的we:TextureRenderer不是VisualTree的一部分(因为它在属性中)。因此,绑定无法找到源元素。

根据ElementName Binding is failing,您可以使用

Source={x:Reference window}

而不是ElementName=window

答案 1 :(得分:-1)

根据MSDN文档here

您需要将绑定的NotifyOnSourceUpdated设置为true