error on accessing a property of a control in a wpf user control

雨燕双飞 提交于 2019-12-23 05:15:44

问题


i have created a wpf user control with a text box and a combo box. for accessing the text property of the text box i have used the below code

public static readonly DependencyProperty TextBoxTextP = DependencyProperty.Register(
        "TextBoxText", typeof(string), typeof(TextBoxUnitConvertor));

public string TextBoxText
{
    get { return txtValue.Text; }
    set { txtValue.Text = value; }
}

in another project i have used the control and bind the text as below:

<textboxunitconvertor:TextBoxUnitConvertor Name="wDValueControl" TextBoxText="{Binding _FlClass.SWa_SC.Value , RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"  Width="161" Height="28" HorizontalAlignment="Left" VerticalAlignment="Top"/>

i am certain that the class that is used for binding is properly working because when i used it to bing with a text box directly in my project it works properly but when i bind it to the text property of textbox in usercontrol it brings null and the binding does not work. can any one help me?


回答1:


Your dependency property declaration is wrong. It has to look like shown below, where the getter and setter of the CLR property wrapper call the GetValue and SetValue methods:

public static readonly DependencyProperty TextBoxTextProperty =
    DependencyProperty.Register(
        "TextBoxText", typeof(string), typeof(TextBoxUnitConvertor));

public string TextBoxText
{
    get { return (string)GetValue(TextBoxTextProperty); }
    set { SetValue(TextBoxTextProperty, value); }
}

In the XAML of your UserControl, you would bind to the property like this:

<TextBox Text="{Binding TextBoxText,
    RelativeSource={RelativeSource AncestorType=UserControl}}" />

If you need to get notified whenever the TextBoxText property changes, you could register a PropertyChangedCallback with PropertyMetadata passed to the Register method:

public static readonly DependencyProperty TextBoxTextProperty =
    DependencyProperty.Register(
        "TextBoxText", typeof(string), typeof(TextBoxUnitConvertor),
        new PropertyMetadata(TextBoxTextPropertyChanged));

private static void TextBoxTextPropertyChanged(
    DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    TextBoxUnitConvertor t = (TextBoxUnitConvertor)o;
    t.CurrentValue = ...
}



回答2:


You are not creating the dependency property right. Use this code:

public string TextBoxText
        {
            get { return (string)GetValue(TextBoxTextProperty); }
            set { SetValue(TextBoxTextProperty, value); }
        }

public static readonly DependencyProperty TextBoxTextProperty =
            DependencyProperty.Register("TextBoxText", typeof(string), typeof(TextBoxUnitConvertor), new PropertyMetadata(""));

Then in your custom control Bind the TextBoxText to the value of txtValue.Text



来源:https://stackoverflow.com/questions/40692232/error-on-accessing-a-property-of-a-control-in-a-wpf-user-control

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!