2012-03-23 1 views
3

Я пытаюсь использовать (впервые) шаблон MVVM для работы диаграммы WPF, и я не могу понять проблему! почему я не получаю ничего от своего MainWindow во время отладки! в моем окне вывода у меня есть сообщение об ошибке:MVVM Patttern: BindingExpression path error: свойство «Data» не найдено в 'object'

System.Windows.Data Error: 40 : BindingExpression path error: 'Data' property not found on >'object' ''String' (HashCode=-354185577)'. BindingExpression:Path=Data; DataItem='String' (HashCode=-354185577); target element is 'ColumnSeries' (Name=''); target property is >'ItemsSource' (type 'IEnumerable')

здесь моя MainWindow.xaml в myProject.View

<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(); 
    } 
} 
} 

вот мой ModelView в MyProject.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; } 
} 

} 

Любая помощь будет оценена на самом деле: '(

ответ

5

Удалить линию

DataContext="Test" 

из верхней части вашего XAML.

Вы устанавливаете DataContext в свой код, но затем снова устанавливаете его в строку в своем XAML.

2

Я знаю, что этот ответ очень поздний, но я уверен, что он поможет кому-то там.

я потратил часы, потому что я столкнулся с этой ошибкой, которые происходят, как правило, с новичками, как и я:

ошибка говорит:

BindingExpression path error: property not found on 'object'

и это действительно ясно сообщение, если я сконцентрировал с начала.

в моем случае я обнаружил, что я определил Фейлд без собственности

вроде следующего:

public string Name = "textss"; 

и I процессор XAML хотите свойство полностью реализована следующим образом:

public string _name = "textss"; 

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

или, по меньшей мере, следующие

public string Name {get; set;} 

поэтому ответ на этот вопрос здесь заключается в том, что свойство Date имеет некоторую ошибку! Я думаю, что ошибка в вызове propChanged и передавая имя с маленькой буквы «данные» не «данные»

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

Вы совершенно правы. Моя проблема была точно такой же - я просто не понимал, что это должна быть НЕДВИЖИМОСТЬ, а не только поле. Благодарю. – Kath

Смежные вопросы