V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

WPF 中的 TextBlock 控件,后台获取不到他的 Name

  •  
  •   BadCat · 8 天前 · 388 次点击

    第一次接触 wpf,但一上来就要改功能。一脸懵逼百度了一下午,没找到解决方法 求解

    17 回复  |  直到 2017-12-07 17:05:17 +08:00
        1
    BadCat   8 天前
        2
    BadCat   8 天前

    用 FindName 查控件 结果是 null 脑袋大
        3
    yaozhenxing   8 天前
    好像要加 x:name="jyly" 三年前写过 wpf
        4
    ragnaroks   8 天前
    @yaozhenxing
    x:Name==Name 但 x:Name!==Name

    this.JYLY 能否取到?或者你取的时候,这个窗口的对象是否存在?
        5
    BadCat   8 天前
    @yaozhenxing x:Name 也试过了 同样不行
    @ragnaroks 这个 textblock 是在 DataGrid.Columns 里的 窗口对象什么意思 usercontrol 吗
        6
    nannanziyu   8 天前   ♥ 1
    在 DataTemplate 里,不能这样访问
    用 VisualTreehelper 递归下去找
    添加下面的扩展方法,然后 this.Layout.FindDescendants<TextBlock>().Where(x=>x.Name == "NAME")

        7
    jitongxi   8 天前
    微软的毛玩意出问题很正常.........
    我见识过各种各样的. 写 wpf 的时候
        8
    nannanziyu   8 天前
    @jitongxi
    来把你所有能找到 WPF 的所谓 bug 列出来,我给你一一解答
        9
    BadCat   8 天前
    @nannanziyu Name 和 x:Name 查出来的都是 null
        10
    BadCat   8 天前
    忘了说了 有 4 个 DataGridTemplateColumn,每个里面结构都是这样的
    <DataGridTemplateColumn Header="检验领域" Width="*">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <TextBlock x:Name="JYLY" Text="{Binding Path=MethodField,
    UpdateSourceTrigger=PropertyChanged}"
    FontSize="13" Background="Transparent" HorizontalAlignment="Center"
    VerticalAlignment="Center"/>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
        11
    nannanziyu   8 天前
    @BadCat
    首先你要保证元素已经被加载到了可视化树上
    比如你在界面上已经能看到了之后,才能在可视化树上查到
    比如你在构造函数里是查不到的
        12
    nannanziyu   8 天前
    @BadCat
    而且你这样找到元素也没有意义,它作为 Cell,是会根据数据源创建出多个来的
    你应该做的是访问它对应的 ViewModel,然后设 MethodField
        13
    jitongxi   8 天前
    @nannanziyu 16 年的时候写的时候, 布局文件的缓存干扰过好几次.
        14
    BadCat   8 天前
    @nannanziyu 确实是这样,现在的目的就是给 TextBlock 赋值,但是这个 binding 我又不会用 搞了半天没搞出个头绪,想用.Text 直接给 TextBlock 赋值。。。。现在的话,我觉得我还是继续看下 binding 吧
        15
    nannanziyu   8 天前
    @BadCat
    你去找 DataGrid 设置 ItemSource 的地方
    这个 ItemSource 一定是一个列表,列表的每一个元素就是对应最终表格的一行
    这个元素里对应的 MethodField 被绑定到了 TextBlock 上,你只需要改变 MethodField 的值就可以改变显示的文本了
        16
    nannanziyu   8 天前   ♥ 1
    @BadCat
    推荐一个 snoop
    https://github.com/cplotts/snoopwpf
    wpf 界面开发必备,查可视化树,动态观察和设置 VM 等等( vs2017 也自带了 Live Visual Tree )
        17
    BadCat   8 天前
    @nannanziyu 我去试一下 多谢
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1683 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 52ms · UTC 14:01 · PVG 22:01 · LAX 06:01 · JFK 09:01
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1