Xaml 如何在Windows应用商店应用程序中显示带绑定数据的格式化文本?

Xaml 如何在Windows应用商店应用程序中显示带绑定数据的格式化文本?,xaml,mvvm,windows-runtime,windows-store-apps,winrt-xaml,Xaml,Mvvm,Windows Runtime,Windows Store Apps,Winrt Xaml,我想将TextBlock的内容绑定到包含多个数据绑定视图模型属性的格式化字符串。我还尝试使用MVVM模式 例如,我想将文本绑定到如下内容:String.Format{0}/{1},Usage,Total,其中Usage和Total是视图模型属性 我尝试过使用运行,但绑定它们的文本属性似乎不起作用,而且XAML与字符串相比比较混乱。格式: 我曾考虑添加一个额外的视图模型属性来进行文本格式化,但它似乎不合适;我希望视图包含表示逻辑 我该怎么做?请注意,我喜欢可维护、整洁、优雅和有组织的解决方案。您可

我想将TextBlock的内容绑定到包含多个数据绑定视图模型属性的格式化字符串。我还尝试使用MVVM模式

例如,我想将文本绑定到如下内容:String.Format{0}/{1},Usage,Total,其中Usage和Total是视图模型属性

我尝试过使用运行,但绑定它们的文本属性似乎不起作用,而且XAML与字符串相比比较混乱。格式:

我曾考虑添加一个额外的视图模型属性来进行文本格式化,但它似乎不合适;我希望视图包含表示逻辑

我该怎么做?请注意,我喜欢可维护、整洁、优雅和有组织的解决方案。

您可以使用绑定对象的StringFormat属性来格式化字符串。在您的情况下,当然需要使用多重绑定

可以使用绑定对象的StringFormat属性格式化字符串。在您的情况下,当然需要使用多重绑定


我会按照您个人的建议在ViewModel上添加一个附加属性。您的视图模型将始终与视图紧密耦合,因此我也不会认为这是一件坏事


如果您确实不想这样做,那么可以在堆栈面板中使用多个文本框,方向为水平。

我会按照您个人的建议在ViewModel上添加一个附加属性。您的视图模型将始终与视图紧密耦合,因此我也不会认为这是一件坏事


如果您确实不想这样做,则可以在堆栈面板中使用多个文本框,方向为水平。

当您说绑定Run控件的Text属性不起作用时,是否确实绑定到了正确的对象?我还提到了一个明显的问题,即您的属性是否在视图模型中正确声明,但我假设您已经检查了这一点,并确保了getter/setter的范围足够大。我在几个应用程序中广泛使用这种方法,并且没有任何问题。您的输出窗口中是否有任何绑定错误可能有助于缩小原因

我建议不要在视图模型中添加属性,直到您完全确定无法对视图执行所需操作为止-如果以后需求发生变化,并且您希望对其中一个值应用前景色颜色变换器,该怎么办

编辑

我刚刚完成了一个简单的演示项目,展示了它的工作原理。在VS->文件->新建->项目->空白应用程序XAML中 已编辑的MainPage.xaml和MainPage.xaml.cs。文件全文如下

MainPage.Xaml

<Page
    x:Class="RunDemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:RunDemo"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <!-- added from here... -->
        <TextBlock FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Run Text="{Binding Usage}"/>
            <Run Text=" / "/>
            <Run Text="{Binding Total}"/>
        </TextBlock>
        <!-- ...to here. -->
    </Grid>
</Page> 
主页,xaml.cs

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

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace RunDemo
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            DataContext = new DummyViewModel();
        }
    }

    public class DummyViewModel : INotifyPropertyChanged
    {
        private int total = 15;
        private string usage = "ten";
        public int Total
        {
            get
            {
                return total;
            }
            set
            {
                total = value;
                OnPropertyChanged("Total");
            }
        }
        public string Usage
        {
            get
            {
                return usage;
            }
            set
            {
                usage = value;
                OnPropertyChanged("Usage");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if(null != PropertyChanged)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

当您说绑定Run控件的Text属性不起作用时,您确定要绑定到正确的对象吗?我还提到了一个明显的问题,即您的属性是否在视图模型中正确声明,但我假设您已经检查了这一点,并确保了getter/setter的范围足够大。我在几个应用程序中广泛使用这种方法,并且没有任何问题。您的输出窗口中是否有任何绑定错误可能有助于缩小原因

我建议不要在视图模型中添加属性,直到您完全确定无法对视图执行所需操作为止-如果以后需求发生变化,并且您希望对其中一个值应用前景色颜色变换器,该怎么办

编辑

我刚刚完成了一个简单的演示项目,展示了它的工作原理。在VS->文件->新建->项目->空白应用程序XAML中 已编辑的MainPage.xaml和MainPage.xaml.cs。文件全文如下

MainPage.Xaml

<Page
    x:Class="RunDemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:RunDemo"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <!-- added from here... -->
        <TextBlock FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Run Text="{Binding Usage}"/>
            <Run Text=" / "/>
            <Run Text="{Binding Total}"/>
        </TextBlock>
        <!-- ...to here. -->
    </Grid>
</Page> 
主页,xaml.cs

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

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace RunDemo
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            DataContext = new DummyViewModel();
        }
    }

    public class DummyViewModel : INotifyPropertyChanged
    {
        private int total = 15;
        private string usage = "ten";
        public int Total
        {
            get
            {
                return total;
            }
            set
            {
                total = value;
                OnPropertyChanged("Total");
            }
        }
        public string Usage
        {
            get
            {
                return usage;
            }
            set
            {
                usage = value;
                OnPropertyChanged("Usage");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if(null != PropertyChanged)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

谢谢我不知道多重绑定。不幸的是,它在Windows应用商店应用程序中似乎不起作用。该问题已适当标记,但我在问题正文或标题中未提及此要求,因此我对其进行了编辑以使其更清晰。谢谢!我不知道多重绑定。不幸的是,它在Windows应用商店应用程序中似乎不起作用。问题被适当地标记了,但我在问题正文或标题中没有提到这一要求,所以我对其进行了编辑以使其更清楚。您能发布一些代码吗?您的视图模型.cs文件会很有用,特别是声明您的用法和总属性的部分。@ZombieSheep,我认为视图模型代码与此无关。无论属性只是返回常量、是自动实现的,还是正确地使用INotifyPropertyChanged,结果都是一样的。只有当我尝试绑定到运行的文本属性而不是TextBlock属性时,问题才会出现。我刚刚看到你对我的答案的评论-我只是想知道在实现属性时是否有错误,但看起来不是这样。你能发布一些代码吗-你的视图模型.cs文件会很有帮助,请指定
在声明您的用法和总属性的部分中单击鼠标右键。@ZombieSheep,我认为视图模型代码与此无关。无论属性只是返回常量、是自动实现的,还是正确地使用INotifyPropertyChanged,结果都是一样的。只有当我尝试绑定到运行的文本属性而不是TextBlock属性时,问题才会出现。我刚刚看到你对我的答案的评论-我只是想知道在实现属性时是否有错误,但看起来不是这样。我确信我绑定到了正确的对象,因为如果它们是正确的,绑定工作正常应用于其他对象,如文本块。我检查了输出窗口,没有发现任何与绑定相关的错误。很奇怪,我很想知道发生了什么。如果您解决了这个问题,请告诉我们。正如我所说,我很高兴在我的应用程序中绑定运行的测试属性,所以我根本不知道这里发生了什么你肯定是在使用Windows应用商店应用程序项目而不是SilverLight或WPF吗?添加了完全可以工作的示例,可以添加到新的空白应用程序模板应用程序中。我最终发现,正如你所说,问题中的XAML代码确实工作正常。我遇到的问题是因为一个无关的原因,但我实际上忘记了这个原因是什么。我早就修好了。谢谢你的帮助!我确信我绑定到了正确的对象,因为如果将绑定应用到其他对象(如TextBlocks),则绑定工作正常。我检查了输出窗口,没有发现任何与绑定相关的错误。很奇怪,我很想知道发生了什么。如果您解决了这个问题,请告诉我们。正如我所说,我很高兴在我的应用程序中绑定运行的测试属性,所以我根本不知道这里发生了什么你肯定是在使用Windows应用商店应用程序项目而不是SilverLight或WPF吗?添加了完全可以工作的示例,可以添加到新的空白应用程序模板应用程序中。我最终发现,正如你所说,问题中的XAML代码确实工作正常。我遇到的问题是因为一个无关的原因,但我实际上忘记了这个原因是什么。我早就修好了。谢谢你的帮助!