【问题标题】:Inline c# in XAML front-end: Why doesn't this work in XAML?XAML 前端中的内联 c#:为什么这在 XAML 中不起作用?
【发布时间】:2016-02-29 17:49:21
【问题描述】:

场景:在 UWP 中开发一个“厚”客户端,使用 c# 用于 Windows 8.1/10 桌面(商店应用程序)。

在我的用户界面中,我尝试使用以下内联

    <StackPanel Grid.Column="0">
    <TextBlock  x:Name="Qty_Size_Crust" Margin="25,10,20,0" Padding="0,0,0,0" TextAlignment="Left" TextWrapping="Wrap" MaxHeight="25" Foreground="#ff230909" FontFamily="Segoe UI" FontSize="16" xml:space="preserve" HorizontalAlignment="Left">
if ({Binding WidgetName} == "Backend")
{             
        <Run Text="{Binding ItemCode, Converter=ItemCodeToDescriptionConverter}"/> 
}
else
{
       <Run Text="See Administrator}"/> 
}
    </TextBlock>

编译器会接受这个,但在执行过程中,我既看不到项目描述也看不到管理员。为了这项工作,我还应该做些什么吗?我可以通过将代码放在 ViewModel 中来解决这个问题,但想知道为什么这不起作用(或者它不应该起作用)。

【问题讨论】:

  • 我希望,伙计。那将会很酷。我认为您处于 ASP.Net 心态。 C# 只能存在于代码隐藏中。不在声明性代码中。对不起。
  • 我发誓我能够在 XAML 的旧版本中做到这一点。也许我的思绪要走了……

标签: c# winrt-xaml win-universal-app windows-8.1-universal


【解决方案1】:

XAML 不适用于内联脚本,因此答案很简单 - 它不受支持。

在您的示例中 - 条件代码只是在 TextBlock 中运行文本时添加,因此编译器接受。

至于您的特定问题的最佳解决方案 - 视图模型中的条件是一个很好的条件。 TemplateSelector 可以在视图端工作,但需要更多代码。如果您希望能够测试它,视图模型实际上也可能是放置它的最佳位置,因此它确实是正确的方法。将逻辑放入视图层只会添加无法进行单元测试的代码。

【讨论】:

  • 值得指出的是,TemplateSelector 可能是 XAML 平台中性能最差的部分,并不是一个好的选择。我会推荐一种由代码隐藏控制的视觉状态。
  • 感谢 Filip,感谢您的洞察力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多