我有以下自定义控件:
<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一起使用?
答案 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}" />