MVVM - 绑定到深层嵌套字符串时的基础知识

时间:2013-01-22 17:15:34

标签: xaml mvvm binding

我正在尝试将字符串绑定到我的文本框控件,但字符串已被隐藏。

我想使用的代码是以下设计的示例

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"; }
        }
}

我的虚拟机看起来像

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

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

我的问题是,如何使用Xaml将Message绑定到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}" />

我知道这个例子是愚蠢的,但是很多时候类的属性是List类型,并且在List中是另一个等等,并且知道如何向下钻取到特定属性,无论深层是多少层很重要,但我没有在哪里找到如何。

2 个答案:

答案 0 :(得分:2)

这可以假设datacontext是您的viewmodel:

<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; }
}

答案 1 :(得分:2)

一种方法是在视图模型中提供数据:

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}" />