WPF:当字符串的值为null或string.Empty时触发Fire数据

时间:2011-04-23 18:51:53

标签: wpf xaml triggers datatrigger

我创建了DataTemplate

<DataTemplate DataType="{x:Type model:Person}">
  <StackPanel>
    <!-- Text box is binding to the person's Image property. -->
    <TextBlock Text="{Binding Image}" />
    <Border>
      <Border.Style>
        <Style TargetType="Border">
          <Style.Triggers>
            <!-- Data trigger is binding to the same Image property. -->
            <DataTrigger Binding="{Binding Image}" Value="{x:Null}">
              <Setter Property="Background">
                <Setter.Value>
                  <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                    <GradientStop Color="#696969" Offset="0.0" />
                    <GradientStop Color="#2E2E2E" Offset="1.0" />
                  </LinearGradientBrush>
                </Setter.Value>
              </Setter>
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </Border.Style>
    </Border>
  </StackPanel>
</DataTemplate>

Person类看起来像这样:

public class Person
{
    public string Image { get; set; }
}

数据模板中显示的数据触发器无法按预期工作。无论我是否提供Image属性的值,它都不会绘制线性渐变画笔背景。另一方面,文本块显示Image属性的内容。

我认为可能在person.Image = null;时,然后XAML实际上将其读作person.Image = string.Empty;,但我尝试将Value="{x:Null}"替换为Value="",但它仍然没有工作。

请帮助,谢谢。

3 个答案:

答案 0 :(得分:0)

尝试在Person类上实现更改通知。这可能是你问题的原因。

答案 1 :(得分:0)

绑定是正确的,但由于Border为0×0 px,因此您看不到任何内容。你可以得到这样的效果:

<Border Width="50">
    <TextBlock Text="{Binding Image}" />
    <!-- your style unchanged -->
</Border>

答案 2 :(得分:0)

正如AbdouMoumen建议的那样,在你的Person类上实现INotifyPropertyChanged。

public class Person : INotifyPropertyChanged
{
    private string _image;
    public string Image
    {
        get { return _image; }
        set
        {
            _image = value;
            NotifyPropertyChanged("Image");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

然后只设置person.Image = null会对你的xaml产生影响。