C# UWP用户控制转换器参数绑定为空

C# UWP用户控制转换器参数绑定为空,c#,uwp,binding,dependency-properties,ivalueconverter,C#,Uwp,Binding,Dependency Properties,Ivalueconverter,我有一个用户控件,它有一个属性主题。主题只是元素主题的枚举 public sealed partial class PlaylistControl : UserControl, MediaControlListener { public ElementTheme Theme { get; set; } public static readonly DependencyProperty ThemeProperty = DependencyProperty.Register("The

我有一个
用户控件
,它有一个属性
主题
主题
只是
元素主题
枚举

public sealed partial class PlaylistControl : UserControl, MediaControlListener
{
    public ElementTheme Theme { get; set; }
    public static readonly DependencyProperty ThemeProperty = DependencyProperty.Register("Theme", typeof(ElementTheme), typeof(PlaylistControl), new PropertyMetadata(null));

    ...
}
在该控件的xaml中,我有一个
TextBlock
,它的
Foreground
Foreground=“{x:Bind isplay,Converter={StaticResource RowColorConverter},ConverterParameter={Binding Theme},Mode=OneWay}”

然而,转换器似乎没有得到主题。它总是空的

class RowColorConverter : Windows.UI.Xaml.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value.Equals(true) ? Helper.GetHighlightBrush() :
                                    parameter is ElementTheme && (ElementTheme)parameter == ElementTheme.Dark ? Helper.WhiteSmokeBrush : Helper.BlackBrush;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return null;
    }
}

怎么了?

您在创建主题时使用了
新属性元数据(null)

其含义是将
主题的默认值设置为null。请尝试将其修改为新属性元数据(ElementTheme.Light)

更新

我不知道在不播放音乐时要转换回哪种颜色,所以我正在尝试这种方法

我试图简化内容,假设您不需要主题资源。这就是这个想法的解决方案:

首先在App.xaml中定义两个笔刷资源,即未播放状态和播放状态


编写一个方法,从当前资源中检索具有指定名称的资源:

公共静态笔刷GetResourceBrush(字符串键)
{
返回(刷)Application.Current.Resources[key];
}
然后使用IsPlaying属性直接转换它

公共类RowColorConverter:IValueConverter
{
if(值为bool显示)
{
返回isplay?GetResourceBrush(“播放前景”):
GetResourceBrush(“UnplayForeground”);
}
返回GetResourceBrush(“UnplayForeground”);
}
更新2

但是你的钥匙和我的主题有什么不同


主题切换需要创建两个分别名为Light和Dark的资源字典。在这两个资源字典中,有同名的资源

当需要更改主题时,应修改控件的
RequestedTheme
属性,而不是创建新的主题属性

切换主题时,软件还会切换相应的
资源字典
,且资源名称不变。这就是为什么
GetResourceBrush(字符串键)
总是基于键获取当前主题资源的原因


致意。

谢谢Richard回答我的问题。正如他所提到的,我无法将绑定主题传递给
ConverterParameter
。因此,使用
ConverterParameter
无法解决我的问题

我发布答案的原因是,我只是想展示一下解决问题的方法

由于我只能同时显示一个
播放控件
,因此我可以声明另一个静态变量
UITheme CurrentTheme
。加载控件时,将其成员变量
Theme
分配给
CurrentTheme
,我可以在转换器中轻松切换颜色:

public object Convert(object value, Type targetType, object parameter, string language)
{
    return value.Equals(true) ? Helper.GetHighlightBrush() :
                                CurrentTheme == ElementTheme.Dark ? Helper.WhiteSmokeBrush : Helper.BlackBrush;
}

我已经改变了它,但它仍然不起作用。我已经在xaml中将这个值设置为暗,但是它仍然被识别为空。嗨,你能为你的UserControl提供xaml代码吗?这可能是一个绑定问题如果需要,控件的源xaml是,使用它的位置是,转换器是。您好,我检查了您的代码并找到了原因:
ConverterParameter
不是从属属性,因此它将无法使用绑定。如果你想根据主题改变颜色,你不必这么复杂。您可以参考,只需将控件的
RequestedTheme
设置为自动切换文本颜色。我这样做的原因是我突出显示了当前播放的音乐。所以我用了一个转换器。我不知道在不播放音乐的时候要转换回哪种颜色(因为我有两个主题),所以我试着这样做。你对此有什么建议吗?