获取DataTemplate控件的好方法是什么?我已经使用了在感兴趣的控件上处理Loaded事件的技术,以及使用VisualTreeHelper来处理可视树,这些都不是非常优雅。访问DataTemplate控件的好方法是什么?
在一个例子中,我需要添加一个在设计时不知道ConverterParameter的绑定,并且由于不支持绑定到ConverterParameters,我需要在代码中创建绑定。理想情况下,我希望能够在除了数据模板中的控件的Loaded事件处理之外的某个地方执行此操作。
实际上,在这种情况下,处理事件根本不起作用并导致OutOfMemoryException。这是我的尝试:
generic.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SilverlightTest">
<Style TargetType="local:TemplatedControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:TemplatedControl">
<ListBox ItemsSource="{TemplateBinding ListBoxItemsSource}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock x:Name="SomeTextBlock"
Loaded="SomeTextBlock_Loaded"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
templatedcontrol.cs:
public class TemplatedControl : Control
{
public object ListBoxItemsSource
{
get { return (object)GetValue(ListBoxItemsSourceProperty); }
set { SetValue(ListBoxItemsSourceProperty, value); }
}
public static readonly DependencyProperty ListBoxItemsSourceProperty =
DependencyProperty.Register
("ListBoxItemsSource", typeof(object),
typeof(TemplatedControl), new PropertyMetadata(null));
public TemplatedControl()
{
this.DefaultStyleKey = typeof(TemplatedControl);
}
public void SomeTextBlock_Loaded(object sender, RoutedEventArgs ea)
{
}
}
答案 0 :(得分:1)
你可以在你的DataTemplate中使用另一个控件来处理它,但这也是一种混乱,但需要注意的是“除非你真的认为逻辑证明了这一点”。
您可能想重新考虑一下您的方法。在我看来(这只是一个观点!),只应该在更多异国情调情境中的代码中绑定。
也许不使用IValueConverter,而是绑定到ViewModel上的属性(假设您的ItemsSource是ViewModel的集合),并让您的VM相应地转换您的值。让这个控件的默认样式是通用的和丑陋的,并且可以在需要绑定到特定属性时使用特定样式。