【问题标题】:WPF bindings in window and user control窗口和用户控件中的 WPF 绑定
【发布时间】:2015-12-07 17:08:22
【问题描述】:

我有控件库和 WPF 应用程序。我需要创建我的自定义控件来可视化图形。所以我制作了 GraphControl 并在那里设置了自定义属性 GraphData:

public static readonly DependencyProperty GraphDataProperty = DependencyProperty.Register("GraphData", typeof(Graph), typeof(GraphControl));

public Graph GraphData
{
    get { return (Graph)GetValue(GraphDataProperty); }
    set
    {
        SetValue(GraphDataProperty, value);
        TextBlock.Text = "asdfasdfasdfasdfasd";
    }
}

这部分已经完成,但是现在我想将 GraphData 绑定到嵌套 GraphControl 的应用程序的 MainWindow 中的属性。我的意思是我想更改 MainWindow 中的一些 graphData 属性,当我这样做时,图形会重新渲染,并且所有渲染都发生在控件内,而不是窗口内。例如:

<controls:GraphControl x:Name="GraphControl" GraphData="{Binding GraphData}"/>

如果我在 Window 中创建新的 DependencyProperty,则所有更改都在窗口中处理,而不是在控件中处理。

【问题讨论】:

    标签: c# wpf data-binding binding


    【解决方案1】:

    据我所知,您希望将控件的属性绑定到窗口而不是 DataContext 上的属性。 如果是这种情况,您可以使用 RelativeSource 属性来实现它,如下所示:

    <controls:GraphControl x:Name="GraphControl" GraphData="{Binding Path=GraphData, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
    

    【讨论】:

    • + 没有理由在 MainWindow 类中创建 DependencyProperty,您只需实现 INotifyPropertychanged 将数据绑定到您的控件。
    • @VadimMartynov 你看,当我在 Window 中定义新的 DependencyProperty 时,即使使用你的代码,它也会变成新实例并且不会影响 UserControl。我的意思是,例如,我通过 Control 代码隐藏中的 setter 中的代码更改 Control 内的文本,我在那里放置了断点。当我的表单出现时,我达到了这个 bp,但当我在 Window 中设置属性时没有
    • 只是为了添加到 Leo 的答案,您需要 Mode=TwoWay,才能真正发挥作用。但是,如果您要使用相同的属性两次,那么不要创建两次,而是使用附加属性。
    • 嗯,是的,实际上“Mode=TwoWay”可能是默认值,具体取决于您绑定的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2015-03-17
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多