1

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

例如,我想将文本数据绑定到这样的东西:String.Format("{0} / {1}", Usage, Total, whereUsageTotalare view-model 属性。

我尝试过使用Runs,但绑定它们的Text属性似乎不起作用,并且 XAML 与以下相比是混乱的String.Format

<TextBlock>
    <Run Text="{Binding Usage}" />
    <Run Text=" / " />
    <Run Text="{Binding Total}" />
</TextBlock>

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

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

4

3 回答 3

3

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

如果您真的不想,那么您可以在堆栈面板中使用多个文本框,其方向为水平方向。

于 2013-03-12T09:53:57.983 回答
1

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

我建议在您完全确定您不能对视图执行您想要的操作之前不要向您的视图模型添加属性 - 如果稍后需求发生变化并且您想要(例如)应用前景色变换器怎么办价值观之一?

编辑

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

主页.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));
        }
    }
}
于 2013-03-13T16:53:30.647 回答
0

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

<MultiBinding StringFormat="{}{0} / {1}">
    <Binding Path="Usage" />
    <Binding Path="Total" />
</MultiBinding>
于 2013-03-12T09:29:55.887 回答