绑定麻烦

时间:2014-02-21 20:27:51

标签: c# wpf xaml

我正在尝试将查询结果绑定到My datagrid,当前正在显示Nothing。如果我可以得到Bind的指导。

public int Indepth { get; set; }
public ReportGridViewModel(IEventAggregator events)
{
    EndDateTo = DateTime.Today;
    StartDateTo = DateTime.Today;
    using (var ctx = DB.Get())
    {
         var query = from z in ctx.Interactions
             where z.ActivityDate >= StartDateTo && z.ActivityDate <= EndDateTo
             select new {Indepth = z.Indepth};
         Indepth = query.Count();
    }
}

Xaml Bindings:

<DatePicker x:Name="StartDateTo" SelectedDate="{Binding StartDateTo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DatePicker x:Name="EndDateTo" SelectedDate="{Binding EndDateTo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

<telerik:GridViewDataColumn Header="InDepth" DataMemberBinding="{Binding Indepth}"/>

我认为这与我的约会参数有关,但我不完全确定。

使用下面的代码来测试绑定并且它可以正常工作

using (var ctx = DB.Get())
        {
            Items.AddRange(
                ctx.Interactions.Select(
                x => new InteractionDTO()
                {
                    ActivityDate = x.ActivityDate,
                    Indepth = x.Indepth
                }
                )
           );
        }

1 个答案:

答案 0 :(得分:0)

正如@WilliamCustode在评论中提到的那样,您还没有提供足够的代码来确切地知道可能出现的错误。但是,所有这些Binding问题都以同样的方式解决。您需要简化情况并采用有条理的方法。

首先,我们确保DataContext已正确设置为ReportGridViewModel的实例。接下来,我们检查数据:

using (var ctx = DB.Get())
{
     var query = from z in ctx.Interactions
         where z.ActivityDate >= StartDateTo && z.ActivityDate <= EndDateTo
         select new {Indepth = z.Indepth};
     Indepth = query.Count();
} // <-- put a breakpoint here

使用断点,您可以测试您的Indepth属性实际是否具有值。如果这一切都很好,我们会在Visual Studio输出窗口中检查Binding错误。你应该看到这样的东西:

  

System.Windows.Data错误:40:BindingExpression路径错误:'object'''NameOfDataBoundObject'(Name ='')'上找不到'some'属性。 BindingExpression:路径= SomePath; DataItem ='NameOfDataBoundObject'(Name =''); target元素是'TypeOfUiElement'(Name ='NameOfUiElement'); target属性是'PropertyName'(类型'TypeOfProperty')

始终关注这些错误,因为它们可以帮助您了解您的问题所在。说了这么多,我想我刚刚注意到你的问题实际上是什么......你似乎试图从视图模型绑定到你的Indepth属性,但是你的GridViewDataColumn没有将视图模型作为其DataContext。大概,你有这样的事情:

<telerik:GridView ItemsSource="{Binding SomeCollection}">
    <telerik:GridView.Columns>
        <telerik:GridViewDataColumn Header="InDepth" 
            DataMemberBinding="{Binding Indepth}" />
        ...
    <.telerik:GridView.Columns>
</telerik:GridView>

GridViewDataColumnDataContext设置为SomeCollection集合属性中的相关数据项,不设置视图模型。但是, 仍然可以使用RelativeSource Binding这样的内容访问视图模型:

<telerik:GridViewDataColumn Header="InDepth" DataMemberBinding="{Binding Indepth, 
RelativeSource={RelativeSource AncestorType={x:Type YourPrefix:YourWindow}}}" />

在此示例中,YourWindowWindowUserControl的名称,其视图模型设置为DataContextYourPrefix是该类的XAML命名空间。最后,回到上面显示的假想错误,你会有一个说'Indepth' property not found on 'object' ''NameOfClassInSomeCollection'之类的东西,就是你找到问题的线索。