1

文字列をテキストボックスコントロールにバインドしようとしていますが、文字列が埋もれてしまいます。

使用したいコードは次のような工夫された例です

namespace BackUps.Logging.ViewModel
{
    class Obj1
    {
        public Obj2 obj2 { get; set; }
    }

    class Obj2
    {
        public Obj3 obj3 { get; set; }
    }

    class Obj3
    {
        public string Message 
        {
           get { return "Hello World"; }
        }
}

私のVMは次のようになります

namespace BackUps.Logging.ViewModel
{
    internal class LogsVM
    {
       public Obj1 Obj1 { get; private set; }

    public LogsVM()
    {
          Obj1 = new Obj1();
    }
}

私の質問は、Xamlを使用してメッセージをTextBlockにバインドするにはどうすればよいですか?これは私が持っているものです:

   <Window x:Class="BackUps.Logging.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:myData ="clr-namespace:BackUps.Logging.ViewModel"
        Title="Logging Results" Height="350" Width="525">

    <Grid DataContext="{x:Type myData:LogsVM}">
        <TextBlock Text="{Binding Message}" />
    </Grid>
</Window>

上記は機能しません。また、

<TextBlock Text="{Binding Obj1.Message}" />

また

<TextBlock Text="{Binding Obj1.Obj2.Obj3.Message}" />

この例は巧妙ですが、クラスのプロパティがリストタイプであり、そのリスト内に別のタイプがある場合が多く、特定のプロパティにドリルダウンする方法を知っていると、レイヤーの深さがいくつであっても重要ですが、私は方法を見つける場所がありません。

4

2 に答える 2

2

これは、データコンテキストがビューモデルであると想定して機能します。

<Window x:Class="WpfGridColumns.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="WidthAndHeight"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:wpfGridColumns="clr-namespace:WpfGridColumns"
        d:DataContext="{d:DesignInstance Type=wpfGridColumns:LogsVM, IsDesignTimeCreatable=True}"
        >
    <Grid>
        <TextBox Text="{Binding Obj1.obj2.obj3.Message}" />
    </Grid>
</Window>

次の構文を使用して、設計時データを設定できます。

d:DataContext="{d:DesignInstance Type=wpfGridColumns:LogsVM, IsDesignTimeCreatable=True}"

VSデザイナにIntellisenseを提供し、バインディングを配置するときに役立ちます。

私はこのコードを後ろで使用しました:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new LogsVM();
    }
}

internal class LogsVM
{
    public Obj1 Obj1 { get; private set; }

    public LogsVM()
    {
        Obj1 = new Obj1();
    }
}

public class Obj1
{
    public Obj1()
    {
        obj2=new Obj2();
    }
    public Obj2 obj2 { get; set; }
}

public class Obj2
{
    public Obj2()
    {
        obj3= new Obj3();
    }
    public Obj3 obj3 { get; set; }
}

public class Obj3
{
    public Obj3()
    {
        Message = "Test";
    }
    public string Message { get; set; }
}
于 2013-01-22T17:19:08.890 に答える
2

1つの方法は、ビューモデルにデータを提供することです。

namespace BackUps.Logging.ViewModel
{
    internal class LogsVM
    {
       public Obj1 Obj1 { get; private set; }

        public LogsVM()
        {
            Obj1 = new Obj1();
        }

        public string GetMyString
        {
            get{ return Obj1.Obj2.Obj3.Message; }
        }
    }
}

次に、その文字列にバインドします。

<TextBlock Text="{Binding GetMyString}" />
于 2013-01-22T17:19:11.293 に答える