有没有简单的方法在xaml中指定int值

问题描述 投票:0回答:5

我想在 xaml 中设置带有 int 值的 Tag 属性。但是在资源中定义 int 然后引用该资源作为绑定对我来说看起来不是一个完美的方法。从代码中将 string 值转换为 int 更容易。 那么,有没有办法在xaml中轻松设置int值?

wpf xaml binding
5个回答
21
投票

请尝试这个。

在 xaml 中添加命名空间 xmlns:sys="clr-namespace:System; assembly=mscorlib"

<sys:Int16 x:Key="IntNo">1</sys:Int16> or

<sys:Int32 x:Key="IntNo1" >1</sys:Int32>

注意:同样,您也可以用于双值


13
投票

如果对将其声明为资源不感兴趣,您可以内嵌声明它,有点像这样:

    <Button>
        <Button.Tag>
            <sys:Int32>5</sys:Int32>
        </Button.Tag>
    </Button>

10
投票
xmlns:sys="clr-namespace:System;assembly=mscorlib"


<Grid>
    <Grid.Resources>
        <sys:Int32 x:Key="IntValue" >1</sys:Int32>
    </Grid.Resources>
    <Button x:Name="Button" Tag="{StaticResource IntValue}"></Button>
</Grid>

够简单吗?如果您要在多个地方使用您的值,上面的示例将是合适的。否则:

<Button x:Name="Button" >
        <Button.Tag>
            <sys:Int32>1</sys:Int32>
        </Button.Tag>
    </Button>

2
投票

在 XAML 2009 中,您可以简单地使用

"x"
前缀,例如
x:Boolean
x:Decimal
x:Int32

请参阅 Microsoft - 常见 XAML 语言原语的内置类型


示例:

此示例来自 WinUI 3 应用程序(WinUI 3 XAML 与 UWP XAML 非常相似,并且与 WPF XAML 大部分相似)

<Window
    x:Class="MyApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="MyApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid>
        <Button x:Name="MyButton" Click="MyButton_Click" Content="Print 'Tag' value to console">
           <Button.Tag>
              <x:Int32>42</x:Int32>
           </Button.Tag>
         </Button>    
    </Grid>
</Window>

背后代码:

    private void MyButton_Click(object sender, RoutedEventArgs e)
    {
        int value = (int) MyButton.Tag;

        Debug.WriteLine(value);
    }

您还可以指定一个接受

int
的命令参数:

<Button Command="{x:Bind ViewModel.AddMinutesCommand}" Content="+ 30 Minutes">
   <Button.CommandParameter>
      <x:Int32>30</x:Int32>
   </Button.CommandParameter>
</Button>

对于 XAML 2009 在各种技术中的可用性似乎存在一些困惑:Stackoverflow - Can XAML 2009 相关的标记扩展可以在 WPF 中使用吗?

老实说,我也不明白为什么我的工作示例代码只能使用

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
作为
x
命名空间 而不必在这里指定类似
2009/xaml
的内容。

如果您能澄清这一点,请随意更改此答案。


0
投票

您可以创建自定义

MarkupExtension
来实现所需的内联行为。

[MarkupExtensionReturnType(typeof(int))]
public class IntExtension : MarkupExtension
{
    public IntExtension(int value)
    {
        Value = value;
    }

    [ConstructorArgument("value")]
    public int Value { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Value;
    }
}

那么就这么简单:

<Button Command="{Binding MyCommand}" CommandParameter="{local:Int 5}">
© www.soinside.com 2019 - 2024. All rights reserved.