以编程方式从DataTemplate访问控件

时间:2009-09-04 18:48:27

标签: silverlight datatemplate

获取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)
        {
        }
    }

1 个答案:

答案 0 :(得分:1)

你可以在你的DataTemplate中使用另一个控件来处理它,但这也是一种混乱,但需要注意的是“除非你真的认为逻辑证明了这一点”。

您可能想重新考虑一下您的方法。在我看来(这只是一个观点!),只应该在更多异国情调情境中的代码中绑定。

也许不使用IValueConverter,而是绑定到ViewModel上的属性(假设您的ItemsSource是ViewModel的集合),并让您的VM相应地转换您的值。让这个控件的默认样式是通用的和丑陋的,并且可以在需要绑定到特定属性时使用特定样式。