【问题标题】:WPF change value of a child inside UserControlWPF 在 UserControl 中更改子项的值
【发布时间】:2016-12-14 14:05:42
【问题描述】:

我需要从 CustomControl 中的 Control 的 MainWindow 更改一个值。 所以假设我想从 MainWindow.xaml 更改 UserControl MyControl 中的 Labels Content强>。

例子:

<UserControl x:Class="XXXXX.MyUserControl"
.
.
.
>
    <Grid>
        <Label x:Name="TestLabel"/>
    </Grid>
</UserControl>

在 MainWindow.xaml 中: &lt;MyUserControl x:Name="TestControl" /&gt;

现在如何从 MainWindow.xaml 中的 Xaml 设计器访问 Label.Content?

我没有找到任何东西,所以希望有人知道如何做到这一点。

非常感谢

【问题讨论】:

  • 那么你的代码是什么样的?
  • 您是否尝试过让用户控件使用与主窗口相同的数据上下文?
  • @Bryan 这会是什么样子?

标签: c# wpf xaml user-controls


【解决方案1】:

在您的 UserControl 中公开一个自定义属性,如下所示

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();

        var dpd = DependencyPropertyDescriptor.FromProperty(LabelContentProperty, typeof(MyUserControl));
        dpd.AddValueChanged(this, (sender, args) =>
        {
            _label.Content = this.LabelContent;           
        });
    }

    public static readonly DependencyProperty LabelContentProperty = DependencyProperty.Register("LabelContent", typeof(string), typeof(MyUserControl));

    public string LabelContent
    {
        get 
        {
            return GetValue(LabelContentProperty) as string;
        }
        set 
        {
            SetValue(LabelContentProperty, value);
        }
    }
}

在 MainWindow 的 xaml 中

<MyUserControl x:Name="TestControl" LabelContent="Some Content"/>

【讨论】:

    【解决方案2】:

    将以下内容添加到您的用户控件中

    <UserControl x:Class="XXXXX.MyUserControl"
      DataContext="{Binding RelativeSource={RelativeSource Self}}"
    .
    .
    >
    

    让用户控件实现 INotifyPropertyChanged

    像这样向用户控件添加一个属性

       Private _LabelText As String 
        Public Property LabelText() As String
            Get
                Return _LabelText
            End Get
            Set(ByVal value As String)
                _LabelText = value
                OnPropertyChanged("LabelText")
            End Set
        End Property
    

    从该属性更新要绑定的标签

    <Label x:Name="TestLabel" Content="{Binding Path=LabelText}"/>
    

    然后在您的 MainWindow 中,您可以相应地更改属性

    <MyUserControl x:Name="TestControl" LabelText="Testing" />
    

    那么你后面的代码也可以引用该属性

    【讨论】:

    • 嗯,是的,如果我想设置该标签的一个或几个属性,这会起作用,但如果我想设置一百个呢?使用这种方法,我将不得不创建一百个新属性,这些属性将完全超大。更好的解决方案是直接从 MainWindow.Xaml 绑定到标签属性
    • @DanielDirtyNativeMartin 您所要求的完全删除用户控件会更有意义。但是,如果您想保留用户控件并能够将值绑定到控件,我认为这就是您想要的
    • 由于可重用性,如果它可以在 UserControl 中并且尽可能简单,那将非常有帮助。是否没有真正的可能性直接访问该 UserControl 内的 Label ?这样您就可以完全访问该标签的所有属性
    • 我不熟悉。如果您想保持用户控制,我的回答是我会做什么。但是如果需要更改这么多属性,那么我建议您查看用户控件的设计
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多