【问题标题】:Programmatically access a control from a DataTemplate以编程方式从 DataTemplate 访问控件
【发布时间】:2009-12-10 01:33:36
【问题描述】:

在 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)
        {
        }
    }

【问题讨论】:

  • 您能否对此进行扩展以包含一个有用的场景?

标签: silverlight datatemplate


【解决方案1】:

您可以在 DataTemplate 中使用另一个控件来处理该问题,但这也有点混乱,还有“除非您真的相信逻辑证明它是合理的”的警告。

您可能需要重新考虑您的方法。在我看来(这只是一种意见!),一个人应该只在更exotic的情况下绑定代码。

也许不是使用 IValueConverter,而是绑定到 ViewModel 上的属性(假设您的 ItemsSource 是 ViewModel 的集合),并让您的 VM 相应地转换您的值。让此控件的默认样式通用且难看,并且在需要绑定到特定属性的情况下使用特定样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多