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

我的虚拟机看起来像

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 中是另一个等,并且知道如何深入到一个特定的属性,不管有多少层很重要,但我've得到无处找出如何。

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

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

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 回答