为什么这个 .NET 11 预览功能在 MAUI 社区引起轰动在 .NET MAUI 中设计干净的 UI 听起来很简单但格式化文本、组合值或进行简单的 UI 计算通常会迫使我们创建一次性转换器设置额外的 ViewModel 属性使用笨拙的 StringFormat 技巧对于像显示价格这样的小事情这一切都感觉工作量太大了。但 .NET 11 通过名为XAML 中的 C# 表达式的新功能解决了这个问题。一个小变化却带来了巨大而令人兴奋的影响有了这个预览功能你终于可以直接在 XAML 中编写简短、安全的 C# 表达式无需转换器无需样板代码无需繁琐的仪式。什么是“XAML 中的 C# 表达式”XAML 中的 C# 表达式让我们可以直接在绑定中嵌入简短的代码片段。我们可以直接在标记中表达最终的显示值而不是将绑定与转换器配对。该功能由 XAML 源代码生成器提供支持它在构建时验证并从这些表达式生成强类型代码。这使得一切保持安全、快速和可读同时让 XAML 感觉更加自然。为什么这个功能非常重要以下是在 XAML 中使用 C# 表达式的主要好处更快的入门初学者不需要学习转换器或额外的模式就能显示格式化的值。更少的样板代码小型、仅视图的转换不会强制要求额外的 ViewModel 属性或一次性转换器。更强的工具支持源代码生成带来了闪电般的编译时验证和比旧方法更高的性能提升。这些超级能力共同使我们的 UI 代码感觉像我们在屏幕上想象的那样直观和生动。何时使用它以及何时不使用像任何工具一样XAML 中的 C# 表达式在合适的场景中表现出色。用于小型、表现层逻辑格式化值货币、日期等简单数学运算字符串组合基于布尔值切换视觉效果避免用于复杂、可重用、业务关键逻辑包括定价规则税务计算需要单元测试或在多个屏幕上重用的逻辑经验法则如果逻辑不能一目了然就将其移至 ViewModel 或域层。熟悉语法以下是一些反映日常 UI 场景的小例子开发人员今天经常依赖转换器或额外的 ViewModel 属性。1) 无需转换器的货币格式化我们可以使用标准的 C# 格式化来格式化货币。它会根据设备或应用程序的区域设置显示本地化货币。Label Text{${Price:C2}} /2) 直接在 UI 中显示计算的总计对于基本总计我们可以将逻辑直接放在标签旁边。Label Text{$Total: {Price * Quantity:C2}} /3) 使用字符串插值构建用户友好的文本我们可以直接在 XAML 中执行字符串插值而不是在 ViewModel 中创建单独的属性。Label Text{${Quantity} × {ProductName}} /4) 使用条件表达式表示状态对于简单的 UI 状态不再需要转换器。Label TextActive IsVisible{IsActive} /Label TextInactive IsVisible{!IsActive} /5) 条件样式也保持干净我们还可以根据状态切换颜色。Label Text{IsActive ? Active : Inactive}TextColor{IsActive ? Colors.Green : Colors.Gray} /迷你页面演练之前 vs. 之后想看看魔法吗没有什么比比较经典页面和升级到 .NET MAUI 的 XAML 中 C# 表达式的页面更好的了。之前有效但增加了额外步骤典型的 XAML 页面可能会以如下绑定开始Label Text{Binding Price, StringFormat{}{0:C2}} /Label Text{Binding Total} /Label Text{Binding DisplayText} /为了支持这一点我们通常会引入纯粹为了格式化 UI 而存在的 ViewModel 属性。public string DisplayText ${Quantity} × {ProductName};public decimal Total Price * Quantity;之后更简洁更直接使用 C# 表达式我们可以直接在 XAML 中表达相同的逻辑无需额外的 ViewModel 属性ContentPage xmlnshttp://schemas.microsoft.com/dotnet/2021/mauixmlns:xhttp://schemas.microsoft.com/winfx/2009/xamlxmlns:localclr-namespace:MauiAppx:ClassMauiApp.MainPagex:DataTypelocal:ProductViewModelVerticalStackLayout Spacing6 Padding16Label Text{ProductName}FontAttributesBoldFontSize18 /Label Text{${Price:C2}} /Label Text{${Quantity} × {ProductName}} /Label Text{$Total: {Price * Quantity:C2}} /Label TextActiveIsVisible{IsActive}TextColorGreen /Label TextInactiveIsVisible{!IsActive}TextColorGray //VerticalStackLayout/ContentPage注意有关更多详细信息请参考 .NET MAUI (.NET 11) 中 XAML C# 表达式的示例https://github.com/SyncfusionExamples/Csharp-Expressions-in-XAML--A-Beginner-Friendly-Leap-for-.NET-MAUI-in-.NET-11这如何融入 MVVM重要的是要强调XAML 中的 C# 表达式是一种表现层便利而不是 MVVM 或ViewModel的替代品。使用表达式进行简短、以 UI 为中心的转换。将业务逻辑、影响行为的计算和共享规则保留在ViewModel或域层中以便它们可以被测试和重用。它是否已经准备好投入生产在现阶段该功能尚未准备好投入生产。它是实验性的与.NET 11 预览版和XamlSourceGen相关联。这使得它非常适合学习、原型设计和内部演示。然而对于面向客户的发布最好等待稳定支持除非你控制完整的部署环境并且对预览依赖项感到满意。如何尝试它初学者友好的设置如果你想安全地进行实验请从小处着手并遵循以下步骤步骤 1启用预览功能使用 .NET 11 预览版并启用预览标签。EnablePreviewFeaturestrue/EnablePreviewFeatures请参考以下图片步骤 2开启 XAML 源代码生成接下来确保启用了 XAML 源代码生成。此功能仅在活动的XamlSourceGen时有效。MauiXamlInflatorSourceGen/MauiXamlInflator步骤 3为页面使用 x:DataType优先使用带有x:DataType的编译绑定以便表达式是强类型的并且工具支持更好。x:DataTypelocal:MainViewModel步骤 4从简单的表达式开始最后一次添加一个表达式。格式化值如价格或标签通常是最容易和最安全的开始地方。.NET MAUI 的未来XAML 中的 C# 表达式推动 MAUI 向更自然、以 C# 为中心的标记工作流程发展。通过减少样板代码并通过源代码生成启用编译时检查开发人员体验变得更加清晰且不易出错。随着 .NET 11 的发展你可以期待此功能不断发展和稳定可能成为开发人员在 .NET MAUI 中编写 XAML 的标准部分。请参考以下图片常见问题我可以在不启用 XamlSourceGen 的情况下在 XAML 中使用 C# 表达式吗不可以。此功能仅在启用 XamlSourceGen 时有效因为表达式是通过源代码生成器处理和编译的。没有它XAML 工具/解析器将无法理解或转换表达式。此功能是否足够稳定可以用于生产应用程序还没有。XAML 中的 C# 表达式目前是实验性的与 .NET 11 预览版本相关联。它非常适合学习、演示和原型设计但对于面向客户的生产应用程序等待它获得官方支持并稳定下来会更安全。C# 表达式是否会取代转换器或 MVVM 模式不会。它们旨在用于小型 UI 转换如格式化、字符串插值或基本计算。转换器和 MVVM 对于可重用的转换、复杂逻辑和应该在屏幕之间测试和共享的业务规则仍然很重要。我可以在 XAML 中的 C# 表达式内调用方法吗只有简单且安全的表达式才能正常工作。我们应该避免异步调用和多步操作。目的是保持 UI 逻辑轻量且可读而不是将应用程序逻辑移到 XAML 中。这些表达式会减慢我的应用程序吗