【问题标题】:MVVM Patttern: BindingExpression path error: 'Data' property not found on 'object'MVVM 模式:BindingExpression 路径错误:在“对象”上找不到“数据”属性
【发布时间】:2012-03-23 13:43:46
【问题描述】:

我正在尝试(第一次)使用 MVVM 模式来制作 WPF 图表,但我无法理解这个问题!为什么在调试时我的 MainWindow 上什么也没有! 在我的输出窗口我有这个错误信息:

System.Windows.Data 错误:40:BindingExpression 路径错误:在 >'object'''String' (HashCode=-354185577)' 上找不到 'Data' 属性。绑定表达式:路径=数据;数据项='字符串' (哈希码=-354185577);目标元素是'ColumnSeries'(名称='');目标属性是>'ItemsSource'(类型'IEnumerable')

这是我在 myProject.View 中的 mainWindow.xaml

    <Window x:Class="Chart.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
     xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="MainWindow" Height="350" Width="525"
    DataContext="Test">
<Grid>
    <chartingToolkit:Chart 
        Height="262" 
        HorizontalAlignment="Left" 
        Margin="33,0,0,620"
        Name="columnChart" 
        Title="ColumnSeriesDemo"
        VerticalAlignment="Bottom"
        Width="360">
              <chartingToolkit:ColumnSeries 
                  IndependentValueBinding="{Binding Path=DateTest, diag:PresentationTraceSources.TraceLevel=High}"
                  DependentValueBinding="{Binding Path=VolumeTest ,diag:PresentationTraceSources.TraceLevel=High}"
                  ItemsSource="{Binding Path=Data, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}" />
    </chartingToolkit:Chart>
</Grid>

这是我的 mainWindow.cs

namespace Chart
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private BindingVM Test;
    public MainWindow()
    {  
        this.Test = new BindingVM();   
        this.DataContext = Test;

        InitializeComponent();   
    }
}
}

这是我在 MyProject.ModelView 中的 ModelView

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using Chart.Model;
using System.Windows.Threading;
using System.ComponentModel;

namespace Chart.ViewModel
{
class BindingVM
{
    public BindingVM()
    {

       // AddElement();
        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Start();

    }

    DataItem item = new DataItem();
    public DateTime DateTest
    {
        get { return item.date; }
        set { item.date = value;
              propChanged("date");
            }
    }

    public Double VolumeTest
    {
        get { return item.volume; }
        set
        {
            item.volume = value;
            propChanged("volume");
        }
    }
    public DispatcherTimer timer = new DispatcherTimer();

    public event PropertyChangedEventHandler PropertyChanged;
    public void propChanged(String propname)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propname));
        }
    }

   public ObservableCollection<DataItem> DataTest = new ObservableCollection<DataItem>();
   public ObservableCollection<DataItem> Data
   {
       get { return DataTest;}
       set { DataTest= value;
             propChanged("data");
           }
   }



   public void timer_Tick(object sender, EventArgs e)

    {
        Random rnd = new Random();
        double baseValue = 20 + rnd.NextDouble() * 10;
        double value = baseValue + rnd.NextDouble() * 6 - 3;

        DataTest.Add(new DataItem()
        {
            date = DateTime.Now,
            open = value + rnd.NextDouble() * 4 - 2,
            high = value + 2 + rnd.NextDouble() * 3,
            low = value - 2 - rnd.NextDouble() * 3,
            close = value + rnd.NextDouble() * 4 - 2,
            volume = rnd.NextDouble() * 200,

        });

        baseValue = value < 6 ? value + rnd.NextDouble() * 3 : value;



        // DataTest.RemoveAt(0);
    }
 }
}

这是我在 myProject.Model 中的模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Chart.Model
{
public class DataItem
{
    public DateTime date { get; set; }
    public double open { get; set; }
    public double high { get; set; }
    public double low { get; set; }
    public double close { get; set; }
    public double volume { get; set; }
}

}

任何帮助将不胜感激:'(

【问题讨论】:

    标签: wpf binding mvvm charts


    【解决方案1】:

    删除线

    DataContext="Test"
    

    从 XAML 的顶部开始。

    您正在代码中设置 DataContext,但随后将其再次设置为 XAML 中的字符串。

    【讨论】:

      【解决方案2】:

      我知道这个回复非常晚,但我相信它会对那里的人有所帮助。

      我花了几个小时,因为我遇到了像我这样的初学者通常会发生的错误:

      错误提示:

      BindingExpression 路径错误:在“对象”上找不到属性

      如果我从一开始就集中注意力,这是非常明确的信息。

      在我的情况下,我发现我定义了没有属性的字段

      如下:

      public string Name = "textss";
      

      我的 XAML 处理器想要一个完全实现的属性,如下所示:

      public string _name = "textss";
      
      public string Name{
      get{
          return _name;
          }
      set{ 
          _name = value ;
          }
      }
      

      或至少如下

      public string Name {get; set;} 
      

      所以这里这个问题的答案是 Date 属性有一些错误! 我认为错误在于调用 propChanged 并使用小写字母“data”而不是“Data”传递名称

      public ObservableCollection<DataItem> DataTest = new ObservableCollection<DataItem>();
         public ObservableCollection<DataItem> Data
         {
             get { return DataTest;}
             set { DataTest= value;
                   propChanged("data");
                 }
         }
      

      【讨论】:

      • 你完全正确。我的问题是完全一样的——我只是没有意识到它应该是 PROPERTY 而不仅仅是字段。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多