繁体   English   中英

WPF:将属性绑定到自定义UserControl

[英]WPF: Binding a property to a Custom UserControl

我在wpf中遇到以下问题:

我已经定义了一个包含文本框的用户控件(在命名空间测试中)(以及其他几个控件,只显示了xaml的相关部分):

<UserControl (...)
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    name="Spinbox">
    (...)
    <StackPanel Orientation="Horizontal">
    <TextBox x:Name="tbText" (...)>
        <TextBox.Text>
            <Binding Path="Value" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:ValidateValue MinVal="0" MaxVal="1" />
                </Binding.ValidationRules>
                <Binding.NotifyOnValidationError>true</Binding.NotifyOnValidationError>
            </Binding>
        </TextBox.Text>
    </TextBox>
    (...)

在主窗口文件中,我正在使用此spinbox:

<Test:SpinBox x:Name="tbTestSpinbox" Value="{Binding Path=TheValue}" 
              MinValue="0" MaxValue="150">
    <Test:SpinBox.Behavior>
        <Controls:SpinBoxNormalBehavior />
    </Test:SpinBox.Behavior>
</Test:SpinBox>

在后面的代码中,我定义了TheValue:

private double theValue;

public Window1()
{
  InitializeComponent();
  TheValue = 10;
}


public double TheValue
{
  get { return theValue; }
  set
  {
    theValue = value;
    NotifyPropertyChanged("TheValue");
  }
}

/// <summary>
/// Occurs when a property value changes
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;

protected void NotifyPropertyChanged(String info)
{
  if (PropertyChanged != null)
  {
    PropertyChanged(this, new PropertyChangedEventArgs(info));
  }
}

当我尝试运行此应用程序时,我在输出窗口中收到消息:

System.Windows.Data Error: 39 : BindingExpression path error: 'TheValue' property not found on 'object' ''SpinBox' (Name='tbTestSpinbox')'. BindingExpression:Path=TheValue; DataItem='SpinBox' (Name='tbTestSpinbox'); target element is 'SpinBox' (Name='tbTestSpinbox'); target property is 'Value' (type 'Double')

并且spinbox没有填充值10,但默认值为0。

有没有人知道如何确保正确显示该值?

您在其XAML中将UserControl的DataContext设置为自身:

<UserControl (...)
    DataContext="{Binding RelativeSource={RelativeSource Self}}"

...所以稍后你这样说:

<Test:SpinBox x:Name="tbTestSpinbox" Value="{Binding Path=TheValue}"
           MinValue="0" MaxValue="150">

“Value”绑定正在寻找SpinBox本身的“TheValue”属性。

而不是使用DataContext,更改UserControl内的绑定以绑定回控件本身。 我通常通过给整个UserControl一个XAML名称来做到这一点:

<UserControl x:Name="me">

然后使用元素绑定:

<TextBox.Text>
    <Binding Path="Value"
             ElementName="me"
             UpdateSourceTrigger="PropertyChanged">

除非另有说明,否则绑定路径始终相对于DataContext。 所以在你的窗口的构造函数中,你应该添加该指令:

this.DataContext = this;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM