为了账号安全,请及时绑定邮箱和手机立即绑定

窗口中的 WPF 用户控件 - 双击时依赖属性值为空

窗口中的 WPF 用户控件 - 双击时依赖属性值为空

C#
当年话下 2021-11-07 20:02:18
我在这里上传了我的示例项目:https : //www.file-upload.net/download-13252079/WpfApp1.zip.html 这是一个 WPF 窗口,其中包含多个相同的用户控件。UserControl 有一个名为“Text”的依赖属性,它绑定到 MainWindowViewModel 的属性并成功显示在 UserControl 的 TextBlock 中。但是,如果我双击 UserControl 并希望它提供其依赖属性的值,则该值为空。为什么是这样?非常感谢你的帮助!编辑:抱歉,这里有一些源代码:UserControl 的 XAML:<UserControl x:Class="WpfApp1.UserControl1"         ...         x:Name="UC1">        <StackPanel Orientation="Vertical">        <TextBlock Margin="5" Text="Test" FontSize="20"></TextBlock>        <TextBlock Margin="5" Text="{Binding ElementName=UC1, Path=Text}" FontSize="20"></TextBlock>    </StackPanel></UserControl>用户控件的代码:public partial class UserControl1 : UserControl, INotifyPropertyChanged{    public UserControl1()    {        InitializeComponent();    }    string text;    public string Text    {        get { return text; }        set { SetProperty(ref text, value); }    }    public static readonly DependencyProperty TextProperty = DependencyProperty.Register(        "Text", typeof(string), typeof(UserControl1));    public event PropertyChangedEventHandler PropertyChanged;    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)    {        if (Equals(storage, value))        {            return false;        }        storage = value;        OnPropertyChanged(propertyName);        return true;    }    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)    {        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));    }}
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

下面是您的 UserControl 代码背后的样子。您不需要实现 INotifyPropertyChanged。


有关所有详细信息,请参阅自定义依赖项属性。具体来说,您必须从属性包装器的 getter 和 setter 中调用GetValueand SetValue(没有其他任何内容)Text。


public partial class UserControl1 : UserControl

{

    public UserControl1()

    {

        InitializeComponent();

    }


    public static readonly DependencyProperty TextProperty =

        DependencyProperty.Register(

            nameof(Text), typeof(string), typeof(UserControl1));


    public string Text

    {

        get { return (string)GetValue(TextProperty); }

        set { SetValue(TextProperty, value); }

    }

}

对于在其自己的 XAML 中绑定到 UserControl 的 Text 属性,您可以使用RelativeSource而不是 ElementName 来保存无用的生成类成员:


<UserControl x:Class="WpfApp1.UserControl1" ...>    

    ...

    <TextBlock Text="{Binding Text,

                      RelativeSource={RelativeSource AncestorType=UserControl}}" .../>

    ...

</UserControl>


查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 282 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信