如何调试UWP xaml绑定?

时间:2016-12-05 18:33:33

标签: c# xaml debugging uwp

我的DataGrid绑定到我的通用Windows平台应用中的ObservableCollection

加载页面时,数据网格不会显示。我在同一页面中有另一个数据网格几乎相同但绑定到另一个集合几乎与第一个集合相同(具有绑定问题)。

有没有办法调试XAML文件?

示例代码:

<GridView Name="HourGridView" Grid.Row="4" 
          ItemsSource="{x:Bind ForeCastsByDates}" 
          Foreground="Chartreuse" >

    <GridView.ItemTemplate>
        <DataTemplate x:DataType="data:ForeCast">
                         .......
        </DataTemplate>
    </GridView.ItemTemplate>

</GridView> 

没有绑定的集合:

private ObservableCollection<ForeCast> ForeCastsByDates;

捆绑好的收藏品:

private ObservableCollection<ForeCast> ForeCasts;

ForeCastsByDates是ForeCasts的一部分:

ForeCastsByDates = new ObservableCollection<ForeCast>( ForeCasts.GroupBy(x => x.Date).Select(x => x.First()));

1 个答案:

答案 0 :(得分:0)

如果我没有错,似乎您实际上是在尝试绑定到字段类而不是属性

数据绑定要求属性正常工作。为此,您必须创建private支持字段和public属性,然后可以使用数据绑定来访问该属性。

private ObservableCollection<ForeCast> _foreCastsByDates;
public ObservableCollection<ForeCast> ForeCastsByDates
{
   get
   {
      return _foreCastsByDates;
   }
   set 
   {
      _foreCastsByDates = value;
      //notify about changes
      OnPropertyChanged();
   }
}

您可能已经注意到该属性在setter中使用了OnPropertyChanged()方法。要实际通知用户界面有关属性的更改,您需要在INotifyPropertyChanged上实现Page界面:

public partial MainPage : Page, INotifyPropertyChanged
{
    // your code...

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));            
    }
}

OnPropertyChanged方法触发PropertyChanged事件,该事件通知侦听器属性已更改。在这种情况下,我们需要通知ForeCastsByDates属性的更改。使用CallerMemberNameAttribute方法参数旁边的OnPropertyChanged,参数会自动设置为调用者的名称(在本例中为ForeCastsByDates属性。

最后,{x:Bind}语法默认为OneTime模式,这意味着它只更新一次而监听属性更改。要确保反映属性的所有后续更新,请使用

{x:Bind ForecastsByDates, Mode=OneWay}

值得一提的是,您必须对ForecastsByDates属性本身进行更改以通知UI(必须执行属性setter才能调用OnPropertyChanged方法)。如果只执行_foreCastsByDates = something,该字段将会更改,但用户界面将不会知道该字段,并且不会反映更改。