代码之家  ›  专栏  ›  技术社区  ›  NickHalden

Silverlight DataTemplate中的Access元素

  •  5
  • NickHalden  · 技术社区  · 16 年前

    我还没有找到一个干净的解决方案,以下问题,即使有一些相关的问题已经在这样做。

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

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

    我想这样做:

    ((TextBlock)myTreeView.Items.ElementAt(0).FindName("myTextBlock")).FontWeight = FontWeights.Bold;
    

    有人有解决办法吗--&燃气轮机;谢谢埃文

    编辑: 有没有一种方法可以编写一个泛型函数来获取基于名称的控件,即使它在数据模板中也是如此?

    LayoutRoot.FindName("myTextBlock"); 如果myTextBlock不在datatemplate中就可以工作。我怎样才能写一本书 findElementInDataTemplate(string elementName, string parentName) 功能?

    5 回复  |  直到 16 年前
        1
  •  0
  •   Devendra    15 年前

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

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

        2
  •  4
  •   Steve Danner    16 年前

    Loaded 控件的事件。以这个数据模板为例。

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

    事件以加载某种集合供以后使用。

    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);
    }
    

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

        3
  •  2
  •   Evan Hutnick    16 年前

    FontWeight={Binding Path=TextProperty, Converter={StaticResource BoldConverter}}
    

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

    这样就不那么痛苦地尝试通过元素找到一个特定的元素。

        4
  •  1
  •   Community Mohan Dere    9 年前

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

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

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

    这么老了 answer Descendents 扩展方法允许您跨对象树枚举控件。举一个例子 TreeViewItem 你应该能找到 TextBlock

    TextBlock tb = treeViewItem.Descendents()
                     .OfType<TextBlock>()
                     .Where(t => t.Name == "myTextBlock")
                     .FirstOrDefault();
    
        5
  •  0
  •   nishantcop    15 年前

    也可以试试这个

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

    其中grd=根元素(要查找的元素的父元素)