【问题标题】:Silverlight on Windows Phone: IValueConverter is never called for a custom bound propertyWindows Phone 上的 Silverlight:从不为自定义绑定属性调用 IValueConverter
【发布时间】:2012-01-25 10:50:57
【问题描述】:

我有一个用户控件,其属性定义如下:

public partial class ChartEx : UserControl
{
    private object _dataSource;

    public object DataSource
    {
        get { return _dataSource; }
        set 
        { 
            _dataSource = value; //break here
        }
    }

}

在我的 xaml 中,我试图将它绑定到一个集合(来自内部数据模板):

<DataTemplate x:Key="tmplCounter">
    <my:ChartEx 
             DataContext="{Binding Converter={StaticResource convTest}, ConverterParameter='DataContext'}"
             DataSource="{Binding Converter={StaticResource convTest}, ConverterParameter='DataSource'}">
    </my:ChartEx>
</DataTemplate>

但在调试器中,我看到 DataSource setter 的值是 System.Windows.Data.Binding 类型的!

值转换器从不使用参数“DataSource”输入,但对于“DataContext”,它可以完美运行。转换器仅用于调试目的,没有它,事情会以同样的方式工作。

如何使绑定对我定义的属性起作用?

【问题讨论】:

  • 我不认为我完全理解你在这里想要完成的事情。为什么需要两次调用转换器?一次在 DataContext 中,一次在 DataSource 中?
  • 我想在DataSource中调用它并获取值。 DataContext 只是为了显示相同的确切标记适用于继承的属性
  • 您在 DataSource 中所做的是您通过调用将传递它的 getter 的方法来调用它的 setter。您是否尝试将图表的 DataContext 作为参数传递给转换器方法?您能否发布不起作用的场景代码以及转换器签名?你为什么试图通过传递数据上下文来转换数据上下文?
  • 那个转换器什么都不做,我只是用它来监控是否发生了绑定。
  • 在 XAML - _dataSource 字段被分配了一个 System.Windows.Data.Binding 类型的奇怪值。我刚刚想通了,很快就会结束这个问题。

标签: c# silverlight binding


【解决方案1】:

好吧,对不起,我是个白痴。 在 XAML 中,您无法绑定到“简单”属性。 prop 必须是依赖属性。以下作品:

public partial class ChartEx : UserControl
{
    public event EventHandler DataSourceChanged;

    public object DataSource
    {
        get { return GetValue(DataSourceProperty); }
        set { SetValue(DataSourceProperty, value); }
    }

    public static readonly DependencyProperty DataSourceProperty =
        DependencyProperty.Register(
            "DataSource",
            typeof(object),
            typeof(ChartEx),
            new PropertyMetadata(true, OnDataSourcePropertyChanged));

    private static void OnDataSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ChartEx source = d as ChartEx;

        if (source.DataSourceChanged != null)
            source.DataSourceChanged(source, new EventArgs());
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多