在WPF中绑定Setter属性的值

本文关键字:属性 Setter 绑定 WPF | 更新日期: 2023-09-27 18:19:01

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

<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正常工作并注册绑定?

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


Update: Snoop显示TextBlock的Visibility属性绑定错误。在DataContext选项卡上,它说"对象为空"。我一直在寻找一种方法来解决这个问题,但我还没能弄清楚如何。如果有人能好心地把我推向正确的方向,我当然会很感激。代码来自这里http://archive.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=PierreCode&ReleaseId=3546

我并不需要一个完整的攻略,我只需要足够的建议来引导我找到解决方案。

在WPF中绑定Setter属性的值

根据您发布的代码,我假设您使用Behavior from Here

现在,如果您下载上面链接中的示例zip,您将获得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}" />

和你应该做的。

附注:

  • 不保留虚拟机中的System.Windows.Visibility。保持虚拟机中的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