在WPF中绑定Setter属性的值

12

我已经花了一整天的时间寻找一种在ComboBox上显示默认文本字符串的方法,我找到最接近可行的例子是使用水印。当我的应用程序打开时,ComboBox 的 Visibility 属性设置为 Collapsed,然后通过命令使其可见。不幸的是,我无法让水印跟随变化。以下是我正在使用的代码:

<Style x:Key="watermarkLabelStyle">
    <Setter Property="TextBlock.Foreground" Value="Black" />
    <Setter Property="FrameworkElement.Opacity" Value="0.8" />
    <Setter Property="TextBlock.FontSize" Value="12" />
    <Setter Property="TextBlock.FontStyle" Value="Italic" />
    <Setter Property="TextBlock.Margin" Value="8,4,4,4" />
    <Setter Property="TextBlock.Visibility" Value="{Binding Visible}" />
</Style>

{Binding Visible}没有效果,即使窗口中的其他控件已经绑定并正常工作。

<ComboBox ItemsSource="{Binding LeagueFormatsNode}"
          x:Name="leagueFormatComboBox"
          Grid.Column="0"
          Grid.Row="1"
          Grid.ColumnSpan="3"
          ScrollViewer.CanContentScroll="False"
          HorizontalContentAlignment="Stretch"
          Visibility="{Binding Visible}"
          Behaviors:WatermarkComboBoxBehavior.EnableWatermark="True"
          Behaviors:WatermarkComboBoxBehavior.Label="Select League Format"
          Behaviors:WatermarkComboBoxBehavior.LabelStyle="{StaticResource watermarkLabelStyle}" /> 

在视图模型中,Visible 属性表示:

public Visibility Visible
{
    get { return _visibile; }
    set
    {
        if (_visibile == value)
            return;
        _visibile = value;
        RaisePropertyChanged(() => Visible);
    }
}

我该怎样让样式中的setter工作并注册绑定呢?

如果需要额外的代码,我很乐意提供。


更新:Snoop在TextBlock的Visibility属性上显示绑定错误。在DataContext选项卡上,它说“对象为空”。我一直在寻找修复这个问题的方法,但我还没有能够找到解决方法。如果有人能够指导我走向正确的方向,我会非常感激。代码来自这里http://archive.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=PierreCode&ReleaseId=3546

我不一定要求完整的步骤,只需要足够的建议来引导我解决问题。


使用 Snoop 检查 Visual Tree 并查看该元素的 DataContext。我怀疑您在 Visual Studio 输出窗口中还可能有绑定错误信息。 - Federico Berasategui
当我使用Snoop时,会出现以下情况:显示名称为'Snoop.XmlSerializers'的程序集在具有ID 1的AppDomain的'LoadFrom'绑定上下文中加载失败。失败的原因是:System.IO.FileNotFoundException:无法加载文件或程序集'Snoop.XmlSerializers,Version = 2.8.0.0,Culture = neutral,PublicKeyToken = null'或其某个依赖项。系统找不到指定的文件。 Snoop在其他应用程序上运行良好。 - Jason D
Snoop 在 TextBlock 的 Visibility 属性上显示绑定错误。在 DataContext 选项卡中,它显示“对象为空”。 - Jason D
这是因为TextBlock可能是由行为创建的。您需要更改行为中的代码,以便TextBlock接收与其关联对象相同的数据上下文。 - Federico Berasategui
嗯... 这应该很有趣。 - Jason D
1个回答

9
根据你发布的代码,我假设你正在使用来自这里行为(Behavior)。如果你下载上述链接中的示例压缩包,你将得到5个文件,它们提供了一组行为(Behavior)(在行为(Behavior)文件夹中找到)。请编辑TextBlockAdorner.cs。在构造函数中,在以下这行代码之后:
m_TextBlock = new TextBlock { Style = labelStyle, Text = label };

新增

m_TextBlock.DataContext = adornedElement;

现在,在你的Style设置器中,将你的Binding切换到

<Setter Property="TextBlock.Visibility"
        Value="{Binding DataContext.Visible}" />

你应该完成了。

附注:

  • 不要在你的VM中保留System.Windows.Visibility。将Visibility属性作为bool保留在VM中,当你在xaml中使用Binding时,使用BooleanToVisibilityConverter(直接在xaml中可用,无需创建)
  • 当你定义Style时,养成指定Type="..."的习惯。它不仅有助于一目了然地识别哪些Style与什么相关,还可以节省每个setter属性的冗余类型限定。

所以类似这样

<Setter Property="FrameworkElement.Opacity"
        Value="0.8" />

将会。
<Style x:Key="watermarkLabelStyle"
        TargetType="{x:Type TextBlock}">
  ...
  <Setter Property="Opacity"
          Value="0.8" />
  • 最后希望这只是你代码中的一个笔误,如果不是,请尝试使用一些命名约定来命名你的属性。在你的VM中,你的属性称为Visible,而它的私有后端则称为_visibile

@JasonD 不用谢 :) 请注意我对你发布的代码的其他方面所做的修改,并尝试将其中一些应用。 - Viv
糟糕,那是一个打字错误。谢谢建议...我仍在逐渐掌握技巧,但每天都在学习更多。 - Jason D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接