1

TextBlock複数のデータ バインド ビュー モデル プロパティを含む書式設定された文字列に aの内容をバインドしたいと考えています。また、MVVM パターンを使用しようとしています。

たとえば、テキストを次のようなものにデータ バインドしたいとString.Format("{0} / {1}", Usage, Total思いUsageますTotal

sを使用してみましRunたが、それらのプロパティのバインドが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 プロパティのバインドが「機能しない」と言うとき、正しいオブジェクトにバインドしていると確信していますか? (ビューモデルでプロパティが適切に宣言されているかどうかという明らかな質問も含めていますが、それを確認し、ゲッター/セッターのスコープが適切であることを確認したと仮定します)。私はこの方法論をいくつかのアプリで広く使用していますが、問題はありません。原因を絞り込むのに役立つバインディング エラーが出力ウィンドウに表示されていますか?

ビューで必要なことを実行できないことが完全に確信できるまで、まだビューモデルにプロパティを追加しないことをお勧めします-後で要件が変更され、(たとえば)前景色のカラーコンバーターを適用したい場合はどうなりますか?価値観の一つ?

編集

動作することを示す簡単なデモ プロジェクトをまとめました。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));
        }
    }
}
于 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 に答える