Встроенный C# в интерфейсе XAML: почему это не работает в XAML?
Сценарий: разработка "толстого" клиента в 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, но удивился, почему это не сработало (а может, и не должно).
1 ответ
XAML не работает со встроенными скриптами, поэтому ответ прост - он не поддерживается.
В вашем примере - код условия просто добавляется, когда текст выполняется в TextBlock, поэтому компилятор принимает это.
Что касается лучшего решения вашей конкретной проблемы - условие в модели представления является хорошим. TemplateSelector
будет работать на стороне просмотра, но требует больше кода. На самом деле модель представления также может быть лучшим местом для ее размещения, если вы хотите иметь возможность ее протестировать, так что это действительно верный способ сделать это. Помещение логики в слой представления просто добавит код, который не может быть проверен модулем.