3

我对 WPF 非常陌生,并且在将请求对象与从 WSDL 派生的嵌套对象绑定到 XAML 文本框时遇到了困难。以编程方式,我能够绑定到文本框,但我想了解通过 XAML 绑定所需的语法。一旦我有了一些方向,研究一个完整的解决方案就会变得容易得多。谢谢

ResultSet 和消息对象将始终为 [0]。

代码

MainWindow()
{
    InitializeComponent();
    GetMarketingMessagesResponse request = new GetMarketingMessagesResponse();
    request = (GetMarketingMessagesResponse)XMLSerializerHelper.Load(request, @"C:\SSAResponse.xml");
    DataContext = request;
    Binding bind = new Binding();
    bind.Source = request.ResultSet[0].Message[0];
    bind.Path = new PropertyPath("SubjectName");
    this.txtbSubject.SetBinding(TextBox.TextProperty, bind);
 }

Visual Studio Watch 中的返回值bind.Source = request.ResultSet[0].Message[0]; 是 bind.Source = {GetMarketingMessagesResponseResultSetMessage} 这是类名。

XAML

我正在寻找如何绑定到这个类和里面的属性的方向

<TextBox Name="txtbMessageDetails" HorizontalAlignment="Right" Margin="0,50.08,8,0"    TextWrapping="Wrap" Text="{Binding Source=ResultSet[0].Message[0], Path=SubjectName}" VerticalAlignment="Top" Height="87.96" Width="287.942"/>

4

2 回答 2

1

您已经将请求对象放入 DataContext 中,使其成为所有绑定的默认Source。因此,您无需指定另一个 Source(它只会覆盖 DataContext),而是使用绑定的 Path 从 DataContext 到您需要的属性:

<TextBox Name="txtbMessageDetails" Text="{Binding Path=ResultSet[0].Message[0].SubjectName}" />

这是一篇解释 DataContext 如何工作的文章,以及它是如何在您的窗口中从控件“继承”到控件的:http: //www.codeproject.com/Articles/321899/DataContext-in-WPF

于 2013-01-02T23:19:47.237 回答
1

使用将接收请求并提取消息的转换器。

<Window.Resources>
    <local:MessageExtractorConverter x:Key="messageExtractorConverter" />
</Window.Resources>


<TextBox Name="txtbMessageDetails" HorizontalAlignment="Right" Margin="0,50.08,8,0"    TextWrapping="Wrap" Text="{Binding Converter={StaticResource messageExtractorConverter}" VerticalAlignment="Top" Height="87.96" Width="287.942"/>

转换器实现:

public class MessageExtractorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var val = value as GetMarketingMessagesResponse;
        if (val != null)
        {
            // You can modify this code to extract whatever you want...
            return val.ResultSet[0].Message[0];
        }
        else
        {
            return null;
        }
   }
于 2013-01-02T22:19:22.263 回答