C# Silverlight数据模板中的Access元素

C# Silverlight数据模板中的Access元素,c#,silverlight,silverlight-3.0,datatemplate,C#,Silverlight,Silverlight 3.0,Datatemplate,我还没有找到一个干净的解决方案来解决下面的问题,尽管已经有一些相关的问题 如果我有一个被多次使用的数据模板,例如TreeViewItem.HeaderTemplate,我如何才能更改某些内容?仅为一些TreeViewItem更改模板 例如,假设我的TVI HeaderTemplate有一个textblock,根据字符串的不同,我希望将fontweight设置为粗体 我想这样做: ((TextBlock)myTreeView.Items.ElementAt(0).FindName("myTextB

我还没有找到一个干净的解决方案来解决下面的问题,尽管已经有一些相关的问题

如果我有一个被多次使用的数据模板,例如TreeViewItem.HeaderTemplate,我如何才能更改某些内容?仅为一些TreeViewItem更改模板

例如,假设我的TVI HeaderTemplate有一个textblock,根据字符串的不同,我希望将fontweight设置为粗体

我想这样做:

((TextBlock)myTreeView.Items.ElementAt(0).FindName("myTextBlock")).FontWeight = FontWeights.Bold;
有人对此有解决方案吗?-->谢谢你,埃文

编辑:是否有一种方法可以编写一个泛型函数来根据控件的名称获取控件,即使它位于数据模板中

LayoutRoot.FindName(“myTextBlock”)将起作用。如何编写
findElementInDataTemplate(string elementName,string parentName)
函数


Evan的答案不是我想要的原因是因为我正在开发一个控件。我希望使用我的控件的应用程序开发人员能够更改控件中的任何元素。如果我使用Evan的解决方案,则需要应用程序开发人员能够访问控件中的所有模板。可能,但不理想。谢谢

如果您使用的是数据绑定,您是否尝试过使用绑定转换器?在这种情况下,你会做一些像

FontWeight={Binding Path=TextProperty, Converter={StaticResource BoldConverter}}
转换器将沿着

string myTestString = (string)value;
if (myTestString.Contains("Bob"))
    return FontWeights.Bold;
return FontWeights.Normal;

这使得尝试在元素中查找特定元素的难度降低。

我对这种要求的第一反应是:你真的确定要这样做吗?我通常会敦促开发人员查看正在使用的现有控制模式。在这种情况下,您所看到的模板化控件似乎是合理的

当然,这并不能提供您所追求的灵活性。您所追求的似乎是可定制控件的“圣杯”,即在不必复制整个控件模板的情况下调整控件的任何细微细节的愿望。当然,这在声明上是不可能的,如果是的话,我会害怕控制它的语法和语义规则

尽管如此,总有例外。所以我会提出一个可能的选择,尽管我觉得你不应该这么做

此旧方法提供了一个
子代
扩展方法,允许您跨对象树枚举控件。给定一个
treevieItem
的实例,您应该能够找到您要查找的
TextBlock
:-

TextBlock tb = treeViewItem.Descendents()
                 .OfType<TextBlock>()
                 .Where(t => t.Name == "myTextBlock")
                 .FirstOrDefault();
textb=treeViewItem.degents()文本块
第()类
.Where(t=>t.Name==“myTextBlock”)
.FirstOrDefault();

我实现这一点的一种方法是使用控件的
Loaded
事件将所有需要的项存储在类级集合变量中。以这个数据模板为例

<DataTemplate>
   ...
   <TextBlock Loaded="TemplateTextBlock_Loaded" />
</DataTemplate>

当然,如果要加载和卸载控件,这可能不适合您。

这是什么版本的silverlight? 这篇文章来自哪一年的“8月10日18:55”

在SL4的当前版本中,它似乎不存在

也可以试试这个

TextBlock txtBlk=grd.FindName(“txtblname”)作为TextBlock


其中grd=您的根元素(您正在寻找的元素的父元素)

我的问题的最佳解决方案。现在让我们假设我问了我真正想问的问题,检查我的编辑。如果您多次使用包含名为“myTextBlock”的控件的DataTemplate,然后执行某种
LayoutRoot.FindName(“myTextBlock”)
操作,那么许多控件中的哪一个称为“myTextBlock”您希望该操作返回吗?@AnthonyWJones很好,已编辑为包含parentName参数。@AnthonyWJones:通常不可能有两个名为的控件。如果在模板中保留两个同名控件,则认为模板是错误的TypeOf@JGord:确保在代码文件的顶部包含了使用System.Linq的
。@JGord:Oops,我的错!它的
类型
不是
类型
,因此进行了相应的编辑。这对我来说很有用,AnthonyWJones的答案在可视化树已经生成时很有用,但在这之前也很有用
private List<TextBlock> templateTextBlocks = new List<TextBlock>();

private void TemplateTextBlock_Loaded(object sender, RoutedEventArgs e)
{
   TextBlock tb = sender as TextBlock;
   if (!this.templateTextBlocks.Contains(tb)) this.templateTextBlocks.Add(tb);
}