【问题标题】:Binding the value of a Setter Property in WPF在 WPF 中绑定 Setter 属性的值
【发布时间】:2013-06-19 20:33:32
【问题描述】:

我整天都在寻找一种在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 检查可视树并查看该元素的 DataContext 是什么。我怀疑您在 Visual Studio 输出窗口中也可能有绑定错误信息。
  • 当我使用 Snoop 时,会发生这种情况:The assembly with display name 'Snoop.XmlSerializers' failed to load in the 'LoadFrom' binding context of the AppDomain with ID 1. The cause of the failure was: System.IO.FileNotFoundException: Could not load file or assembly 'Snoop.XmlSerializers, Version=2.8.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. Snoop 在其他应用程序上运行良好。
  • Snoop 在TextBlock 的可见性属性上显示绑定错误。在 DataContext 选项卡上,它显示“对象为空”。
  • 那是因为 TextBlock 可能是由行为创建的。您必须更改 Behavior 中的代码,以便 TextBlock 收到与 AssociatedObject 相同的 DataContext。
  • 嗯..这应该很有趣。

标签: c# wpf xaml


【解决方案1】:

根据您发布的代码,我假设您使用来自HereBehavior

现在,如果您下载上述链接中的示例 zip,您将获得 5 个文件,这些文件为您提供了这组 Behavior's(位于 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。将 VM 中的 Visibility 属性保留为 bool,当您的 Binding 在 xaml 中使用 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 不客气 :) 请查看我对您发布的代码的其他一些方面的回答所做的编辑,您也许可以使用其中的一些。
  • 废话。那是一个错字。感谢您的建议...我仍然掌握了窍门,但每天都在学习更多。
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2017-05-27
  • 2018-03-12
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多