如何在C#中定义一个常量并在XAML中使用它?

如何在C#中定义一个常量并在XAML中使用它?,c#,data-binding,uwp,uwp-xaml,converters,C#,Data Binding,Uwp,Uwp Xaml,Converters,我尝试在必要时为字符串值定义常量,以避免在代码中隐藏“神奇字符串”。我最近发现自己需要为转换器定义一个自定义格式字符串,所以我定义了public const string MyFormat=“a”在转换器中。使用转换器时,我需要输入“a”作为ConverterParameter,但我希望引用命名常量,而不是键入ConverterParameter=a <TextBlock Text="{x:Bind SomeProperty, Converter={StaticResource MyCon

我尝试在必要时为字符串值定义常量,以避免在代码中隐藏“神奇字符串”。我最近发现自己需要为转换器定义一个自定义格式字符串,所以我定义了
public const string MyFormat=“a”在转换器中。使用转换器时,我需要输入“a”作为
ConverterParameter
,但我希望引用命名常量,而不是键入
ConverterParameter=a

<TextBlock Text="{x:Bind SomeProperty, Converter={StaticResource MyConverter}, ConverterParameter=???}" />
MainPage.xaml.cs

using System.ComponentModel;
using Windows.UI.Xaml.Controls;

namespace XamlConstantReference
{
    public sealed partial class MainPage : Page, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string _someProperty = "Hello World!";

        public string SomeProperty
        {
            get => _someProperty;
            set
            {
                if (_someProperty != value)
                {
                    _someProperty = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SomeProperty)));
                }
            }
        }

        public MainPage()
        {
            InitializeComponent();
        }
    }
}
MyConverter.cs

using System;
using Windows.UI.Xaml.Data;

namespace XamlConstantReference
{
    public class MyConverter : IValueConverter
    {
        public const string MyFormat = "a";

        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (parameter == null)
            {
                return $"Fail. Formatted '{value}' with null parameter.";
            }
            else if (parameter is string parameterString)
            {
                switch (parameterString)
                {
                    case MyFormat:
                        return $"Success! Formatted '{value}' with parameter '{parameterString}'.";

                    default:
                        return $"Fail. Formatted '{value}' with parameter '{parameterString}'.";
                }
            }

            throw new ArgumentException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}

在XAML中使用
{x:Static}
标记扩展来引用C#类中的常量成员。请参阅标记的副本。如果您遇到问题,请发布一个新问题,但请确保该问题包含一个好问题,而不是上面提到的问题。@PeterDuniho{x:Static}在UWP中不存在。在我发布我的问题之前,我回顾了您链接到的所有问题。这三个都是WPF,不适用于UWP。我在我的问题中特别指出,“(注意:这是UWP,不是WPF。)”我清楚地提供了一个我专门为这个问题创建的问题的副本。“第一个涉及枚举,并提供了在XAML中使用枚举值的解决方案,但没有说明如何使用字符串常量,并且不能扩展到字符串常量。””“是的。你应该养成阅读问题第一个答案的习惯。“表明在UWP中没有办法绑定到静态变量”——听起来像是对你的确切问题的回答。您想要使用的数据类型在这里似乎不相关。“您特别建议省略哪些内容?”——实际上不需要的内容。我不会浪费时间逐行阅读您的文章,但是,例如,本例不需要错误处理代码,也不需要所有的XAML标记(一个属性绑定就足以完成手头的任务)。你的帖子中有很多代码在这里根本不重要。@JeremiahMercier请注意,最后一个论点(我是问这个问题的人,所以我知道它是否重复)是非常错误的。典型的问题是提问者根本不知道一个问题是如何重复的。我并不是说这里的情况就是这样;我只想指出,这种推理是一种危险的推理,不应依赖。
using System;
using Windows.UI.Xaml.Data;

namespace XamlConstantReference
{
    public class MyConverter : IValueConverter
    {
        public const string MyFormat = "a";

        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (parameter == null)
            {
                return $"Fail. Formatted '{value}' with null parameter.";
            }
            else if (parameter is string parameterString)
            {
                switch (parameterString)
                {
                    case MyFormat:
                        return $"Success! Formatted '{value}' with parameter '{parameterString}'.";

                    default:
                        return $"Fail. Formatted '{value}' with parameter '{parameterString}'.";
                }
            }

            throw new ArgumentException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}