【问题标题】:Data binding doesn't work XAML C# WPF数据绑定不起作用 XAML C# WPF
【发布时间】:2014-04-13 05:06:58
【问题描述】:

我有一个 WPF 表单,我希望将反序列化的 json 数据绑定到 UI 上的数据网格。但是在这里我无法在 UI 上看到我的数据网格中的值。

JSON response:
Firstly, my json response is in the below format:
{
    "results":
        [
           {"type": "upload", "status": "new","data": {"uuid":"f7e98"},"device_id": "123"},
           {"type": "upload", "status": "new","data": {"uuid":"f8fc1"},"device_id": "456"}, 
           {"type": "upload", "status": "new","data": {"uuid":"fgff1"},"device_id": "678"},
           {"type": "upload", "status": "new","data": {"uuid":"yuki1"},"device_id": "786"},
           {"type": "upload", "status": "new","data": {"uuid":"rtyi1"},"device_id": "654"}
        ]
}

类:

public class UploadStatusList
{
    public List<UploadStatus> results;
}
public class UploadStatus
{
    public string type {get;set;}
    public string status {get;set;}
    public string device_id {get;set;}
    public Data data {get;set;}
}
public class Data
{
    public string uuid {get;set;}
}

这是我的主 window.xaml.cs
MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    // Dependency Property
    public static readonly DependencyProperty actionListProperty =
        DependencyProperty.Register("actionList", typeof(ObservableCollection<UploadStatusList>),
            typeof(MainWindow), new FrameworkPropertyMetadata(null));

    // .NET Property wrapper
    public ObservableCollection<UploadStatusList> actionList
    {
        get { return (ObservableCollection<UploadStatusList>)GetValue(actionListProperty); }
        set { SetValue(actionListProperty, value); }
    }


    public MainWindow()
    {
        InitializeComponent();
        //Code Block for httpwebRequest here
        //JSON Response String 
        string json = stringbuilder.ToString();

        //Newtonsoft.Json.JsonConvert.Deserialize<UploadStatusList>(json) returns null for me here,so using Javascript serializer. No idea why !? 
        UploadStatusList list = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<UploadStatusList>(json);
        foreach (var item in list.results)
        {
            Debug.Print("id: {0}, name: {1}", item.status, item.device_id);
        }
    }
}    

下面是我的 Main Window.XAML ...我是 xaml 的新手,所以不确定我是否遗漏了什么 MainWindow.xaml:

<TabItem x:Name="UploadList" Header="Upload List" HorizontalAlignment="Left" Width="77" Margin="-2,-2,0,2">
                <Grid Margin="0,0,0,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="124*"/>
                        <ColumnDefinition Width="107*"/>
                    </Grid.ColumnDefinitions>


                    <Button x:Name="Button" Content="Refresh" Margin="14,40,0,361" HorizontalAlignment="Left" Width="120" Click="Button_Click"/>

                    <DataGrid Margin="14,79,10,58" x:Name="Access_DataGrid" IsReadOnly="True" ItemsSource="{Binding actionList.results}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False">
          <DataGrid.Columns>
              <DataGridTextColumn Header="status" Binding="{Binding status}" />
              <DataGridTextColumn Header="device id" Binding="{Binding device_id}" />
              <DataGridTextColumn Header="type" Binding="{Binding type}" />
           </DataGrid.Columns>

                    </DataGrid>
                </Grid>
            </TabItem>

【问题讨论】:

标签: c# .net wpf xaml data-binding


【解决方案1】:

你做的很好,但只需要在 ItemSource 的 Binding 中添加 ElemmentName 或使用 DataContext。

   <Window x:Name="mainWindow".....>
       <... ItemsSource="{Binding actionList.results, ElementName=mainWindow}".....

【讨论】:

  • 在你后面的代码中忘记了actionList.Add(list)。抱歉,我删除了你的评论。
  • 你使用列表 (actionList)。您在actionList 中有一些对象或只有一个对象(在mainWindow constructor 中创建)。如果一个对象,您只需将类型 actionList 更改为public UploadStatusList actionList... 和代码actionList=list
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多