2012-02-27 63 views
0

希望有人能帮助解决一些令人沮丧的问题。Silverlight数据绑定问题 - 不与POCO绑定 - Visifire

我有一个图形(visifire),但只是把它看作一个标准的silverlight数据绑定控件。

当试图直接绑定到包含从INotifyPropertyChanged继承的对象(自定义)的List的POCO对象时,则绝对不会发生任何事情!

。由此我的字典项类

class GraphValue : INotifyPropertyChanged 
    { 

    public event PropertyChangedEventHandler PropertyChanged; 

    private string name; 
    public string IndicatorName 
    { 
     get 
     { 
      return name;     
     } 

     set 
     { 
      name = value; 
      onPropertyChanged(this, "IndicatorName"); 
     } 
    } 
    private double _value; 
    public double IndicatorValue 
    { 
     get 
     { 
      return _value; 
     } 
     set 
     { 
      _value = value; 
      onPropertyChanged(this, "IndicatorValue"); 
     } 
    } 

    private void onPropertyChanged(object sender, string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      PropertyChanged(sender, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

我然后创建一个列表并且它把POCO类中调用ClosedSameDayList。数据填充得很好,我检查过了。

最终设置datacontext时,什么也没有发生!

MyGraph.DataContext = ClosedSameDayList.GraphValues.OrderBy(z => z.IndicatorName); 

但是,这里是踢球者。

当执行以下操作,一切正常:

ObservableCollection<KeyValuePair<string, double>> g = new ObservableCollection<KeyValuePair<string, double>>(); 

foreach (var item in ClosedSameDayList.GraphValues) 
{ 
    g.Add(new KeyValuePair<string, double>(item.IndicatorName, item.IndicatorValue)); 
}  
MyGraph.DataContext = g.OrderBy(z => z.Key); 

谨此XAML的图表:

  <vc:Chart xmlns:vc="clr-namespace:Visifire.Charts;assembly=SLVisifire.Charts" DataContext="{Binding}" Name="MyGraph" Height="240" BorderThickness="0" Theme="Theme2" View3D="True" ToolBarEnabled="True" > 
       <vc:Chart.Titles> 
        <vc:Title Text="My Title" /> 
       </vc:Chart.Titles> 
       <vc:Chart.AxesX> 
        <vc:Axis Title="My Title" /> 
       </vc:Chart.AxesX> 
       <vc:Chart.AxesY> 
        <vc:Axis Title="My Title" AxisType="Primary" /> 
       </vc:Chart.AxesY> 
       <vc:Chart.Series> 
        <vc:DataSeries RenderAs="Column" DataSource="{Binding}"> 
         <vc:DataSeries.DataMappings> 
          <vc:DataMapping MemberName="AxisXLabel" Path="IndicatorName"></vc:DataMapping> 
          <vc:DataMapping MemberName="YValue" Path="IndicatorValue"></vc:DataMapping> 
         </vc:DataSeries.DataMappings> 
        </vc:DataSeries> 
       </vc:Chart.Series> 
      </vc:Chart> 

。由此代码ClosedSameDay

class ClosedSameDay 
    { 
     public CamlQuery CamlQuery { get; set; } 
     public List List { get; set; } 
     public ListItemCollection Listitems { get; set; } 
     public List<GraphValue> GraphValues { get; set; } 

     public ClosedSameDay() 
     { 
      GraphValues = new List<GraphValue>(); 
      CamlQuery = new CamlQuery(); 
      CamlQuery.ViewXml = "<View>" + 
      " <Method Name='ITServicedesk_Dashboard_ClosedSameday_Individuals_Readlist'/>" + 
      " <Query>" + 
      "  <OrderBy>" + 
      "   <FieldRef Name='id'/>" + 
      "  </OrderBy>" + 
      "  </Query>" + 
      "  <ViewFields>" + 
      "   <FieldRef Name='id'/>" + 
      "   <FieldRef Name='Name'/>" + 
      "   <FieldRef Name='Total'/>" + 
      "  </ViewFields>" + 
      "</View>"; 
     } 
     public void PopulateObjectData() 
     { 
      foreach (ListItem item in Listitems) 
      { 
       double value = -1; 
       double.TryParse(item["Total"].ToString(), out value); 

       if (item["Name"] != null && !string.IsNullOrEmpty(item["Name"].ToString()) && value != -1) 
       { 
        this.GraphValues.Add(new GraphValue 
        { 
         IndicatorName = item["Name"].ToString(), 
         IndicatorValue = value 
        }); 
       } 
      } 
     } 
     public DataSeries BuildDataSeries() 
     { 

      ObservableCollection<KeyValuePair<string, double>> g = new ObservableCollection<KeyValuePair<string, double>>(); 
      foreach (var item in this.GraphValues) 
      { 
       g.Add(new KeyValuePair<string, double>(item.IndicatorName, item.IndicatorValue)); 
      } 
      Visifire.Charts.DataSeries ds = new Visifire.Charts.DataSeries(); 
      ds.RenderAs = Visifire.Charts.RenderAs.Column; 
      ds.DataSource = g.OrderBy(i => i.Key); 

      Visifire.Charts.DataMapping dm = new Visifire.Charts.DataMapping(); 
      dm.MemberName = "AxisXLabel"; 
      dm.Path = "Key"; 
      ds.DataMappings.Add(dm); 

      Visifire.Charts.DataMapping dm2 = new Visifire.Charts.DataMapping(); 
      dm2.MemberName = "YValue"; 
      dm2.Path = "Value"; 
      ds.DataMappings.Add(dm2); 

      return ds; 
     } 
    } 
+0

您可以共享XAML,以便理解绑定设置吗? – Vivek 2012-02-27 16:35:07

+0

感谢您分享XAML。我曾尝试使用最新版本的Visifire创建POCO课程。它在这里工作得很好。你正在使用哪个版本的Visifire?你可以分享你的ClosedSameDayList代码吗? – Somnath 2012-03-07 08:20:48

+0

嗨有。我正在使用Visifire 4.0.0.0。我已经使用ClosedSameDayList类的代码更新了问题,该类是ClosedSameDay类的实例。 – Fox 2012-03-07 10:46:02

回答

0

我正在关闭此问题。通过创建DataSeries使用下面的手动数据绑定方法,一切都正常工作

public DataSeries BuildDataSeries() 
{ 

    ObservableCollection<KeyValuePair<string, double>> g = new ObservableCollection<KeyValuePair<string, double>>(); 
    foreach (var item in this.GraphValues) 
    { 
     g.Add(new KeyValuePair<string, double>(item.IndicatorName, item.IndicatorValue)); 
    } 
    Visifire.Charts.DataSeries ds = new Visifire.Charts.DataSeries(); 
    ds.RenderAs = Visifire.Charts.RenderAs.Column; 
    ds.DataSource = g.OrderBy(i => i.Key); 

    Visifire.Charts.DataMapping dm = new Visifire.Charts.DataMapping(); 
    dm.MemberName = "AxisXLabel"; 
    dm.Path = "Key"; 
    ds.DataMappings.Add(dm); 

    Visifire.Charts.DataMapping dm2 = new Visifire.Charts.DataMapping(); 
    dm2.MemberName = "YValue"; 
    dm2.Path = "Value"; 
    ds.DataMappings.Add(dm2); 

    return ds; 
}