V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iSNN
V2EX  ›  C#

请教大佬们 WPF Binding 问题

  •  
  •   iSNN · 2021-01-12 10:20:21 +08:00 · 1834 次点击
    这是一个创建于 1436 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在写 WPF,有许多显示状态颜色的按钮,60 个左右,按钮颜色用 Binding 绑了后台的属性,这个属性是没有用字段的,是在 get 里判断 status 状态字段 0,1,2...然后返回 Brushes 。

    所以逻辑就是选择了一个选项,然后判断每个按钮状态修改 status,OnPropertyChanged 通知变更 Brush 属性。

    我在 brush 的 get 里面断点或者 writeline 都证明确实变更时从新调用了 get,但是画面没有变,然后再调整画面大小,左右上下只要一拉伸或者缩小就像刷新一样,就又显示出来了,此时 get 方法没有再次调用。

    推测,其实画面已经 get 到了新的颜色,只是没有渲染上去,调整大小时就从新渲染了画面。

    请问各位大佬,有没有好的解决方案呢...

    7 条回复    2021-03-04 16:29:54 +08:00
    codehz
        1
    codehz  
       2021-01-12 10:25:21 +08:00 via Android
    你这种不伦不类的绑定是怎么回事。。wpf 怎么可能知道你 brush 和按钮的关系呢
    Moyudawang
        2
    Moyudawang  
       2021-01-12 10:41:52 +08:00
    可以先试试给按钮绑定字符串有没有效果,然后再判断是哪里出了问题
    iSNN
        3
    iSNN  
    OP
       2021-01-12 10:51:12 +08:00
    @codehz 绑都绑上了,怎么会不知道什么关系...
    iSNN
        4
    iSNN  
    OP
       2021-01-12 10:57:50 +08:00
    @Moyudawang 每个按钮上有个表示个数的小气泡,用的 MaterialDesign 的 Badged 。数字确实没了,其实画面上有关这个选择后需要 OnPropertyChanged 的字段都挂了,但是我把 brush 的绑定注射后,其他绑定字段又是正常的,能实时渲染。刚刚最新的结果是,badge 和 brush 单独绑定是正常的,如果绑了 badge 又绑了 brush 就不行了。
    forgottencoast
        5
    forgottencoast  
       2021-01-12 22:08:53 +08:00
    你发一个示例项目出来看看。
    slowhand
        6
    slowhand  
       2021-01-13 10:07:50 +08:00
    找了一下自己以前用过的方法,类似这样。

    public static readonly DependencyProperty TitleBackgroundProperty =
    DependencyProperty.Register("TitleBackground", typeof(Brush), typeof(ButtonIcon), new PropertyMetadata(Brushes.Black));
    /// <summary>
    /// 标题背景
    /// </summary>
    public Brush TitleBackground
    {
    get { return (Brush)GetValue(TitleBackgroundProperty); }
    set { SetValue(TitleBackgroundProperty, value); }
    }

    <Border Grid.Row="1" Background="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path= TitleBackground}"/>
    oWangSir
        7
    oWangSir  
       2021-03-04 16:29:54 +08:00
    如果确认绑定没有问题的话,尝试使用 UpdateLayout()更新布局,我尝试过上千个控件绑定颜色并实时更新,然而并没有遇到过这类问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5438 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:55 · PVG 16:55 · LAX 00:55 · JFK 03:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.