【问题标题】:IValueConverter doesn't executeIValueConverter 不执行
【发布时间】:2014-12-13 23:46:16
【问题描述】:

我有这个 XAML 代码 (ErdMenuItem.xaml):

<UserControl x:Class="ErdBuilder.ErdMenuItem"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:erdBuilder="clr-namespace:ErdBuilder"
  x:Name="UserControl">  

   <UserControl.Resources>
      <erdBuilder:ByteImageConverter x:Key="imageConverter" />
   </UserControl.Resources>

   <Image Source="{Binding Converter={StaticResource imageConverter}, ElementName=UserControl, Path=Icon}" />
</UserControl>

如果我写:

<Image Source="{Binding Converter={StaticResource imageConverter}, ElementName=UserControl, Path=Icon}" />

然后转换器将不会被执行 - 我在转换器中使用断点。但如果我使用这个:

<Image Source="{Binding Converter={StaticResource imageConverter}}" />

然后将执行转换器。 Iconstring 类型的依赖属性。我不知道为什么不会执行转换器,因为我添加了 DependencyProperty,它应该带来我想要转换的值。有什么想法吗?

图标在这里 (ErdMenuItem.xaml.cs):

namespace ErdBuilder
{
    public partial class ErdMenuItem
    {
        public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(string), typeof(ErdMenuItem), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
        public string Icon
        {
            get { return (string)GetValue(IconProperty); }
            set { SetValue(IconProperty, value); }
        }
    }
}

【问题讨论】:

  • 在 UserControl 上看不到属性图标,msdn.microsoft.com/en-us/library/…
  • @Maximus 继承自 UserControl 类 ErdMenuItem
  • 就您的代码而言,乍一看似乎一切都很好。我建议您查看输出窗口并发布您的转换器。

标签: c# wpf xaml converter


【解决方案1】:

那是因为DataContext 中没有数据。绑定表达式返回当前DataContext 的值。您可以使用{Binding Converter={StaticResource imageConverter}, Path=Icon} 表达式为Image 设置DataContext,或为根元素设置它(在您的情况下为UserControl)。这个选项更好,因为您可以使用RelativeSource 表达式来避免使用显式名称。

<UserControl x:Class="ErdBuilder.ErdMenuItem"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:erdBuilder="clr-namespace:ErdBuilder"
  x:Name="UserControl"
  DataContext="{Binding RelateSource={RelativeSource Self}}">

【讨论】:

  • 我添加了 >> DataContext="{Binding RelativeSource={RelativeSource Self}}" > Source="{Binding Converter={StaticResource IconConverter}, ElementName= 更改了绑定UserControl, Path=Icon}" > Source="{Binding Converter={StaticResource IconConverter}, Path=Icon}"
  • "绑定表达式返回当前DataContext的值。" - 我不这么认为。他使用ElementName 直接与UserControl 绑定。如果设置 DataContext,则必须通过 {Binding Converter={StaticResource imageConverter}, ElementName=UserControl, Path=DataContext.Icon} 引用它
  • ElementName 使用 LogicalTree,因此它可以在没有指定 DataContext 的元素之间轻松移动。更重要的是,UserControl 被放置在 Window 中,并且默认情况下它派生该 Window 的 DataContext。基本上,在后台 DataContext 已设置,但无论如何它没有发挥任何作用。 ElementName 不使用 DataContext,它使用树。
  • >> Source="{Binding Converter={StaticResource IconConverter}, ElementName=UserControl, Path=DataContext.Icon}"
  • 这发生在我的一个类似问题上:stackoverflow.com/questions/26814668/…。它似乎对其他人有用,所以我仍然不知道出了什么问题。 编辑:不完全相同,我试图将根上的属性绑定到内部元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2015-06-17
  • 2012-02-07
  • 1970-01-01
  • 2018-11-08
  • 2012-06-14
相关资源
最近更新 更多