我正在尝试将字符串绑定到我的文本框控件,但字符串已被隐藏。
我想使用的代码是以下设计的示例
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中是另一个等等,并且知道如何向下钻取到特定属性,无论深层是多少层很重要,但我没有在哪里找到如何。
答案 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}" />