如何在静态资源上设置依赖属性?

16 浏览
0 Comments

如何在静态资源上设置依赖属性?

我试图解决无法为ConverterParameter指定动态值的问题。请参阅我的其他问题,了解为什么我需要将动态值绑定到ConverterParameter - 我不喜欢目前已发布的解决方案,因为它们都需要对我的视图模型进行我认为是不必要的更改。

为了尝试解决这个问题,我创建了一个自定义转换器,并在该转换器上公开了一个依赖属性:

public class InstanceToBooleanConverter : DependencyObject, IValueConverter
{
    public object Value
    {
        get { return (object)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(InstanceToBooleanConverter), null);
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null && value.Equals(Value);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.Equals(true) ? Value : Binding.DoNothing;
    }
}

是否有办法在我的XAML中使用绑定(或样式设置器、或其他疯狂的方法)来设置这个值?


    
        
            
                
                
            

到目前为止,我看到的例子只绑定到静态资源。

编辑:

我得到了一些反馈,说我发布的XAML只有一个转换器实例。

我可以通过将资源放在我的控件中来解决这个问题:


    
        
            
                
                    
                    
                
                
                    
                
            

0
0 Comments

问题的原因:XAML解析器的工作方式导致ItemsControl中的所有项共享相同的Converter,因此无法在静态资源上设置依赖属性。

解决方法:将依赖属性设置为控件上的资源,这样每个控件都会有一个实例。

以下是整理后的文章:

很遗憾,这种方法行不通——我之前曾经尝试过,结果发现在ItemsControl中的所有项都共享相同的Converter。我认为这是由于XAML解析器的工作方式导致的。

是的,我可以理解这可能是个问题。但是我注意到,如果我将其设置为控件上的资源,那么每个控件都会有一个实例。如果这样更有意义,我可以改变我的问题。

以下是一种解决方法:


    


    
        
            
                
            
        
    

在这个例子中,我们在Window的资源中定义了一个名为myConverter的静态资源。然后,在ItemsControl的ItemTemplate中使用了这个Converter。

这样,每个ItemsControl都会有一个单独的myConverter实例,而不是共享同一个实例。

0
0 Comments

问题的出现原因是设置了一个依赖属性,但是发现在绑定时,setter方法没有被调用。解决方法是将依赖属性的setter方法仅用于代码访问,不要在其中放置任何代码,除了SetValue/GetValue调用。另外,对于绑定的值可能为null的情况,可以使用GetValue方法获取到null值。然而,绑定不是一个值,所以在某些情况下绑定可能不会返回值,因此GetValue返回null。同时,值转换器没有DataContext或视觉树连接,只能通过Source、ElementName和RelativeSource属性进行数据绑定。因此,在这种情况下,将DataContext设置为null、使用ElementName或RelativeSource进行绑定将不起作用。

0