2016-11-09 68 views
0

我创建了一个具有依赖项属性的行为类,我想将其附加到视图中的控件(XAML)中。我正在使用MVVM,我需要通过将它绑定到ViewModel中的属性来设置此附加属性,但它不会被设置。这里是什么,我想要做一个简化版本:未在UWP中通过绑定设置附加行为属性

行为等级:

public static class TestBehavior 
{ 
    public static readonly DependencyProperty SomeStringProperty = 
     DependencyProperty.Register("SomeString", typeof(string), typeof(TestBehavior), new PropertyMetadata("")); 

    public static string GetSomeString(DependencyObject o) 
    { 
     return (string)o.GetValue(SomeStringProperty); 
    } 

    public static void SetSomeString(DependencyObject o, string value) 
    { 
     o.SetValue(SomeStringProperty, value); 
    } 

} 

XAML:

<TextBlock Text="{Binding ViewModelProperty}" local:TestBehavior.SomeString="{Binding ViewModelProperty}" /> 

TextBlock的 “Text” 属性正确结合,但行为的“SomeString”属性没有。有趣的是 - 如果我将行为属性“硬编码”到它确实设置的值。例如:

<TextBlock Text="{Binding TestValue}" local:TestBehavior.SomeString="Foo" /> <!-- This Works --> 

任何想法,为什么绑定到行为属性不起作用?

回答

1

你期望附加的行为做什么?

是否通过在GetSomeString/SetSomeString方法上设置断点来确定附属属性是否工作正常/不工作?如果是这样,这将不会与绑定一起工作,因为在使用绑定时不会调用Get/Set方法。

如果您想要在附加属性发生变化时作出反应,无论它是否通过绑定,请使用调用Register中指定的PropertyMetadataPropertyChangedCallback

+0

这正是我所做的(使用断点)。我添加了回调方法,并且它在绑定上执行。任何想法为什么Get/Set方法在使用绑定时没有被执行? –

+2

这只是绑定基础结构与依赖项属性(正常或附加)一起工作的方式。我相信这是某种形式的内部优化。 – ibebbs

+0

我也相信'GetSomeString'方法只是让您的代码更容易访问该属性的常用模式。平台只是在绑定时设置值。 –