【问题标题】:One databinding prevents other from working一个数据绑定阻止其他数据绑定工作
【发布时间】:2015-10-04 23:58:34
【问题描述】:

我有一个“状态标签”的文本块。我希望更新这个标签,当这种情况发生时,我希望它的颜色也能自动设置 - 以及可见性(标签在有内容之前是不可见的)。

问题是,如果我指定的不仅仅是文本绑定,那么文本块不会改变(即文本不会出现,它仍然是隐藏的)。 实际上,我也尝试过不绑定可见性,并且似乎 Foreground 也阻止了绑定。

<TextBlock x:Name="StatusInfo"
                               HorizontalAlignment="Center" VerticalAlignment="Bottom"
                               FontSize="9"
                               Visibility="{Binding ElementName=ThisUc,
                                                    Path=StatusLabelVisibility}"
                               Text="{Binding ElementName=ThisUc,
                                              Path=StatusLabel}"
                               Foreground="{Binding ElementName=ThisUc,
                                                    Path=StatusLabelBrush}" />

这一切都在 UserControl 中,所以我使用 StatusLabel 属性的依赖属性,因为我想将它绑定到主窗口中的属性... Foreground 和 Visibility 属性不是依赖属性,因为我不想暴露他们。 这是我的属性设置器和获取器:

public string StatusLabel
        {
            get { return (string)GetValue(StatusLabelProperty); }
            set
            {
                SetValue(StatusLabelProperty, value);
                RaisePropertyChanged("StatusLabel");
                if (value != string.Empty)
                {
                    StatusLabelVisibility = System.Windows.Visibility.Visible;
                    if (value.HasAny("success", "ok") && !value.HasAny("partial"))
                    {
                        StatusLabelBrush = Brushes.Green;
                    }
                    else if (value.HasAny("fail"))
                    {
                        StatusLabelBrush = Brushes.DarkRed;
                    }
                    else if (value.HasAny("partial"))
                    {
                        StatusLabelBrush = Brushes.DarkGoldenrod;
                    }
                    else
                    {
                        StatusLabelBrush = Brushes.Black;
                    }
                }
                else
                {
                    StatusLabelVisibility = System.Windows.Visibility.Collapsed;
                }
            }
        }

请让我知道我做错了什么,也许这不是完全可行的方法?

干杯

=====================

虽然 Meredith 的回答解决了这个问题,但让我发表评论以供将来参考(因为这对我来说并不明显):

在这里 - 如果您直接分配 UserControl 属性,而不是通过属性绑定,它似乎失去了“绑定” - 如果您尝试再次更改绑定属性,它不会像它那样更新控件在它“失去界限”之前有过

干杯

【问题讨论】:

  • 您是否尝试过更改您指定的属性的顺序?
  • @Abin - 是的,我有 - 以及更改属性设置器中的语句顺序。这没有帮助 - 实际上,我想了解原理是什么。

标签: c# wpf xaml data-binding binding


【解决方案1】:

如果 StatusLabel 是 DependencyProperty,则不能在 setter 中添加任何其他内容 - 它不会被正确调用。改为查找为 DependencyProperties 执行更改事件的方法。您需要一个 PropertyChangedCallback。查看How to use PropertyChangedCallBack。提升你的 prop 更改,并在回调中设置所有其他属性。

【讨论】:

  • 嗨 - 谢谢,这解决了这个问题 - 我还对一个有点令人费解的相关问题发表了一点评论。在这里 - 如果您直接分配 UserControl 属性,而不是通过属性绑定,它似乎失去了“绑定” - 如果您尝试再次更改绑定属性,它不会像之前那样更新控件'迷失方向'
  • 是的——如果你直接赋值,它实际上会失去绑定。您只需要通过绑定进行分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多