MVVM Patttern: ошибка пути BindingExpression: свойство «Данные» не найдено в «объекте» - PullRequest
3 голосов
/ 23 марта 2012

Я пытаюсь использовать (впервые) шаблон MVVM для работы диаграммы WPF, и я не могу понять проблему!почему я не получаю ничего в моем MainWindow во время отладки!в моем окне вывода у меня есть это сообщение об ошибке:

System.Windows.Data Ошибка: 40: Ошибка пути BindingExpression: свойство «Data» не найдено в> «object» «String» (HashCode =-354185577).BindingExpression: Path = Data;DataItem = 'String' (HashCode = -354185577);целевым элементом является 'ColumnSeries' (Name = '');свойство target равно> 'ItemsSource' (тип '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; }
}

}

Anyпомощь будет оценена по-настоящему: '(

Ответы [ 2 ]

5 голосов
/ 23 марта 2012

Удалите строку

DataContext="Test"

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

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

2 голосов
/ 01 июля 2014

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

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

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

Ошибка пути BindingExpression: свойство не найдено в 'object'

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

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

, как показано ниже:

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 и передаче имени с маленькой буквы «данные», а не «данные»

public ObservableCollection<DataItem> DataTest = new ObservableCollection<DataItem>();
   public ObservableCollection<DataItem> Data
   {
       get { return DataTest;}
       set { DataTest= value;
             propChanged("data");
           }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...