【问题标题】:Dependency Property does not get or set Value依赖属性不获取或设置值
【发布时间】:2012-06-01 14:34:13
【问题描述】:

我在 WPF 中创建了一个用户控件,并在后面的代码中创建了一些依赖属性。

我在我的用户控件中添加了几个 WPF 控件,其中一个是进度条,所以我尝试做的是公开 Value progressBar 属性,如下所示:

     public static readonly DependencyProperty valueProperty = DependencyProperty.Register(
        "Value",
        typeof(Double),
        typeof(MyUserControl),
        new FrameworkPropertyMetadata(
            ValuePropertyCallback));

    private static void ValuePropertyCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args)
    {
        MyUserControl myUserControlInstance = (ProgressControl)controlInstance;
        myUserControlInstance.progressBar.Value = (Double)args.NewValue;
    }

    public Double Value
    {
        get { return (Double)GetValue(valueProperty); }
        set { SetValue(valueProperty, value); }
    }

我在 XAML 中写了这个:

<MyUserControl Name="myControl" Value="{Binding ProgressBarValue}" >

但它似乎不起作用,既没有设置也没有获取值。

我有几个小时的时间来审查这个,但我不知道我做错了什么。

希望你能帮助我,提前谢谢你。

注意: DataContext 是之前定义的,它是正确的,因为这是唯一不起作用的绑定)

【问题讨论】:

  • Binding errors?您是否在本地覆盖了 DataContext,现在它不会像您预期的那样继承另一个数据上下文?
  • 用调试器能看到有没有进入回调吗?
  • @H.B.我已经验证过,实际上我有更多可以工作的属性,因此这个问题对我来说太奇怪了,因为我的所有其他属性都可以正常工作
  • @VincentPiel,是的,我已经这样做了,我从来没有进入回调,但我知道它可以工作,因为如果在设计时我给我的属性设置了一个任意值,进度条会改变它“进步”方面
  • 尝试更改为 smthg,如:new FrameworkPropertyMetadata(new PropertyCallBack(ValuePropertyCallback))

标签: c# wpf user-controls dependency-properties


【解决方案1】:

valueProperty “值”不匹配... (v/V) :=)

【讨论】:

  • 感谢您的回复,但根据我的阅读,“valueProperty”是我的依赖属性,它注册了我的“Value”属性,不是吗?
  • @Dante:你说得对,这个字段叫什么并不重要。
  • 当然 H.B.,没关系...msdn.microsoft.com/en-us/library/ms753358.aspx 查看“依赖属性名称约定”以了解“属性及其支持的 DependencyProperty 字段的命名约定很重要。”跨度>
  • @VincentPiel:我试过了,不管字段叫什么。
【解决方案2】:

您是否尝试过 Mode=TwoWay:

<MyUserControl Name="myControl" Value="{Binding ProgressBarValue, Mode=TwoWay}" > 

我也使用了PropertyMetadata 而不是FrameworkPropertyMetadata

【讨论】:

  • 感谢您的回复。我不知道,我认为它很有用,但它仍然无法正常工作。这真的很奇怪,因为我之前创建了一些依赖项并且它们起作用了:(
【解决方案3】:

尝试将依赖属性的名称更改为 PascalCased:

ValueProperty

您可能还想查看BindsTwoWayByDefault 以确保对您的 DP 所做的更改已写入源对象。

【讨论】:

    【解决方案4】:

    原来我的问题是我没有实现 INotifyPropertyChanged 接口,所以我所做的更改没有显示出来。但由于我是使用 MVVM 的 WPF 新手,所以我不知道。

    但你只需要创建一个 ObservableObject,然后你的 viewModel 类就得继承它。

    Here 是创建 ObservableObject 类以及如何继承它的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多