WinRT自定义控件依赖属性设置/绑定

5

我正在尝试为WinRT/Metro应用程序开发一个自定义控件。

它有一个依赖属性,我希望能够在自定义控件内设置它的值。然而,使用SetValue会破坏消费者创建的任何绑定。

我找到的所有解决方案(例如SetCurrentValue)似乎都不适用于WinRT/Metro。有没有解决办法?

这听起来是一个简单的事情 - 老实说! - 我已经在这里和其他地方尝试寻找解决方案了。非常感谢您的帮助。

1个回答

2
您可以在PropertyMetadata中设置默认值(Dr. WPF的代码片段来帮助!)。
#region IsAvailable
private static bool DefaultIsAvailable = false;

/// <summary>
/// IsAvailable Dependency Property
/// </summary>
public static readonly DependencyProperty IsAvailableProperty =
    DependencyProperty.Register(
        "IsAvailable",
        typeof(bool),
        typeof(CustomControl1),
        new PropertyMetadata(DefaultIsAvailable, OnIsAvailableChanged));

/// <summary>
/// Gets or sets the IsAvailable property. This dependency property 
/// indicates ....
/// </summary>
public bool IsAvailable
{
    get { return (bool)GetValue(IsAvailableProperty); }
    set { SetValue(IsAvailableProperty, value); }
}

/// <summary>
/// Handles changes to the IsAvailable property.
/// </summary>
/// <param name="d">
/// The <see cref="DependencyObject"/> on which
/// the property has changed value.
/// </param>
/// <param name="e">
/// Event data that is issued by any event that
/// tracks changes to the effective value of this property.
/// </param>
private static void OnIsAvailableChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var target = (CustomControl1)d;
    bool oldIsAvailable = (bool)e.OldValue;
    bool newIsAvailable = target.IsAvailable;
    target.OnIsAvailableChanged(oldIsAvailable, newIsAvailable);
}

/// <summary>
/// Provides derived classes an opportunity to handle changes
/// to the IsAvailable property.
/// </summary>
/// <param name="oldIsAvailable">The old IsAvailable value</param>
/// <param name="newIsAvailable">The new IsAvailable value</param>
protected virtual void OnIsAvailableChanged(
    bool oldIsAvailable, bool newIsAvailable)
{
}
#endregion

编辑*

如果您想更改值-可以,但如果您使用基本绑定是OneWay-即-它从绑定源获取值并将其设置为依赖属性-则绑定将停止工作,因为源和目标值不再同步。

如果您设置Mode="TwoWay",则当绑定目标(您的控件)修改依赖属性时,绑定源将被更新,因此绑定仍将有效,并且将继续双向工作。


你的回答指出设置值会破坏绑定 - 这也是我提出问题的原因。我能想到的唯一替代方案是实现INotifyPropertyChanged并使用“常规”属性 - 但这样用户就无法绑定它了。 - Rich T
嗯,实际上 - 我有点困惑。如果将模式设置为TwoWay,则绑定不会中断。 - Filip Skakun
1
根据http://msdn.microsoft.com/en-us/library/windows/apps/hh700353绑定在依赖属性值优先级方面被视为本地值,这意味着如果您将另一个本地值设置到原始保存绑定值的属性中,您将消除该绑定。这似乎是我正在经历的行为。 - Rich T
该死。同样的问题。在开发WPF自定义控件时,我总是使用SetCurrentValue方法。这种方法在Silverlight或WinRT中不存在?非常令人失望。 - Dr. Andrew Burnett-Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接