在自定义控件中使依赖项属性绑定两种方式

时间:2011-11-04 02:44:36

标签: silverlight xaml

我有以下自定义控件:

<TextBox Grid.Column="3" Text="{TemplateBinding SampleValue}" />

public static readonly DependencyProperty SampleValueProperty =
            DependencyProperty.RegisterAttached("SampleValue", typeof(string), typeof(IdattFilterBox), new PropertyMetadata(null));

public string SampleValue
        {
            get { return GetValue(SampleValueProperty) as string; }
            set { this.SetValue(SampleValueProperty, value); }
        }

在我声明自定义控件的UserControl中,我有这样的XAML:

<my:SampleBox SampleValue="{Binding SampleValue, Mode=TwoWay}" />

和ViewModel一样:

public string SampleValue
        {
            get
            {
                return this.sampleValue;
            }

            set
            {
                this.sampleValue = value;
            }
        }

我不关心VM上的INotifyPropertyChanged(所以不要告诉我它:)) 现在它正在文本框中显示文本,就像我在VM中设置文本一样。但是当我修改这个文本时 - 它不会被冒泡回到VM中。

我该怎么办?我想我必须在自定义控件中编写一些代码?我应该处理TextBox PART并捕获LostFocus吗?或者它如何与TemplateBinding一起使用?

4 个答案:

答案 0 :(得分:7)

TemplateBinding仅为OneWay

如果您使用的是Silverlight 4,可以试试这个,

{Binding SampleValue, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}

答案 1 :(得分:4)

TemplateBinding本身就是一种方式。您需要使用Mode=TwoWay

绑定

Source={Binding RelativeSource={RelativeSource TemplatedParent}}

答案 2 :(得分:2)

也许您想要DependencyProperty.Register代替DependencyProperty.RegisterAttached

鉴于你的头衔,你可能不想创造附属物。

修改

我从代码示例中不清楚你提供的确切内容。

要获得双向绑定,您可能在此处获得2个方向

  • 添加INotifyPropertyChanged(由于某种原因你不想要)

  • 处理新的PropertyMetadata(null) 而不是null为那里提供变更事件的处理程序(以及 如果需要,可以使用默认值)并使用NewValue进行所需的操作。

如果可能更新问题,那么更容易理解哪个控件具有什么以及谁绑定如何。 (更多XAML应该这样做)

另请注意,除非失去焦点,否则TextBox不会触发事件。

答案 3 :(得分:0)

首先添加Source绑定,这将显示您是源元素上下文的绑定元素。
尝试使用类似的东西:

<my:SampleBox SampleValue="{Binding SampleValue, Source={StaticResource someViewModel}, Mode=TwoWay}" />