IValueConverter-传递参数,这是我的自定义控件的属性 - c#

我为自定义控件创建了一个.cs类,其中包含以下属性:

  //Property which is defining the unit of the textblock in the Ringslice
    public Units Unit
    {
        get { return (Units)GetValue(UnitProperty); }
        set { SetValue(UnitProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Unit.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty UnitProperty =
        DependencyProperty.Register("Unit", typeof(Units), typeof(RingPresenter), new PropertyMetadata(Units.Degree));

在同一课程中,我定义了单位:

     public enum Units
    {
        Percent,
        Degree,
        Time
    }

现在,在generic.xaml文件中,我得到了一个Textblock,该文本与相同的.cs控件类中的另一个DependencyProperty绑定,该类称为Angle-角度应以正确的格式显示,为此我正在使用ValueConverter它应该基于Unit属性返回一个值。

我的数据绑定工作正常,但是ValueConverter出现问题-最后一个参数很重要!

Text="{Binding Mode=TwoWay, ElementName=ringSlice, Path=EndAngle, Converter={StaticResource DoubleDegreesToInt}, ConverterParameter={Binding RelativeSource={RelativeSource TemplatedParent}, Path=Unit}}"

访问ValueConverter类中的参数将引发NullRefferenceException-这是值转换器的代码:

object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
    {
        Debug.WriteLine(targetType.ToString()); //returning System.String
        Debug.WriteLine(parameter.ToString());  //EXCEPTION
        return Convert.ToInt32(value);     //Is working fine without parameters        
    }

我究竟做错了什么?如何解决此问题?谢谢!

参考方案

我刚刚确认,即使在Universal Apps中,您仍然无法绑定ConverterParameter(ref)。如果Microsoft尝试这样做,这不会成为一个主要的性能瓶颈,那我不会感到惊讶。

您可以执行一些解决方法:

MultiBinding与您的自定义IMultiValueConverter一起使用(但是在UWP应用中看起来可能无法实现?)
创建一个将Units枚举值与数字部分(类似于GridLength之类)结合的value对象
MVVM方法

他们每个人都有自己的优点和缺点。如果任何绑定项被调用,则调用MultiBinding。如果任何绑定经常更改,则可能是性能问题。注意:需要您走树的绑定很昂贵。

MVVM方法是拥有一个ViewModel,该Model具有完全取代IValueConverter的属性。如果Model的Unit和Value属性发生更改,则ViewModel会为计算出的属性引发INotifyPropertyChanged事件,并且UI会更新。

在容器值对象中,您可以添加XAML帮助器,以允许您以字符串格式编写快捷方式,并将其自动解析为所需的值对象。对于影响放置的属性,我已经使用它来取得良好的效果。绑定仍然是单个字段的问题。

在这种情况下,即使您在后面的代码中进行操作,我也会为MVVM方法做更多的工作。

如何在Ubuntu 10.04上安装python软件包 - python

我想在Ubuntu 10.04上安装一些python软件包。我对openssl版本有问题,无法在此Ubuntu上对其进行升级。我也尝试过手动下载模块并运行python3 setup.py install,但是它说我没有setuptools,也无法在此Ubuntu上安装。是否有pythonhosted.org的替代品,它允许较旧的openssl版本以及如何进行…

Windows 10 Universal App C#-运行Javascript - javascript

我有一个C#Windows 10应用程序,我需要能够运行javascript。在.net中,我将使用WebView类来提供此功能,但在Native Windows 10 Universal App中似乎不可用。我将如何做到这一点? 参考方案 您可以继续使用Webview,如下所示:<Grid Background="{ThemeResourc…

在MAC上升级到PHP 5.4并删除版本5.3.10 - php

我想将我的PHP版本更新为5.4版。当我在控制台中通过/ usr / local / bin / php -v查看时,我看到的版本是5.4.3,而使用php -v时,它告诉我已经安装了5.3.10版本。如何删除旧版本? 参考方案 更新:截至2014年初,您可能最好从http://php-osx.liip.ch/版本进行安装,因为它包含大多数扩展。如果确实需要…

通用Windows应用程序中的全局热键 - c#

因此,我创建了一个UWP App,它可以记录多条音频行,并将记录保存到MP3文件中以进行游戏中的多行记录,以后我可以将其单独编辑(游戏音频,麦克风,游戏通讯,语音通讯)作为NVidia ShadowPlay / Share。目前尚不支持。我通过VAC实现了这种多线设置。我有使用常规Windows WPF C#编写的此工具的版本,并且有一个系统范围内的热键Ct…

LeetCode题解足球排球和篮球

一个班级60%喜欢足球,70%喜欢篮球,80%喜欢排球,问:三种球都喜欢占比最大可能有多少,最小可能有多少?即求三种球都喜欢的比例范围题解:(1)首先确定最多的一种情况,就是 60% 喜欢足球的人同时也喜欢篮球和排球,此时为三种球都喜欢的人的最大比例。 (2)然后确定最小的一种情况,根据题目可以知道有 40%的人不喜欢足球,30%的人不喜欢篮球,20%的人不…