2013-06-24 2 views
3

У меня есть WPF applcation, в котором я использовал DataBinding для comboBox. ProjectName из projectList должно добавить внутри моего comboBox, но когда я запускаю приложение, каждый раз, когда я получаю эти ошибки;ошибка выражения связи: свойство не найдено на объекте

System.Windows.Data Error: 40 : BindingExpression path error: 'projectList' property not found on 'object' ''DayView' (Name='MainWin')'. BindingExpression:Path=projectList; DataItem='DayView' (Name='MainWin'); target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable') System.Windows.Data Error: 40 : BindingExpression path error: 'selectedProjectid' property not found on 'object' ''ComboBox' (Name='')'. BindingExpression:Path=selectedProjectid; DataItem='ComboBox' (Name=''); target element is 'ComboBox' (Name=''); target property is 'SelectedValue' (type 'Object')

Моего XAML код, где я использую привязки данных является:

<DataTemplate x:Key="EditableDataTemplate"> 
      <StackPanel Orientation="Horizontal" Width="596"> 
       <TextBox Text="{Binding ClientNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="145"/> 
       <TextBox Text="{Binding ApplicationNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/> 
       <TextBox Text="{Binding StartTimeBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="100"/> 
       <TextBox Text="{Binding StopTimeBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="60"/> 
       <TextBox Text="{Binding TaskNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="130"/> 
       <ComboBox x:Name="ComboBox2" ItemsSource="{Binding Path=projectList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name" SelectedValue="{Binding Path=selectedProjectid}" Width="71" Background="Yellow" BorderThickness="0" DataContext="{Binding RelativeSource={RelativeSource Self}}"/> 
      </StackPanel> 
     </DataTemplate> 

код за это:

public partial class DayView : MetroWindow 
{ 
    private DateTime currentDateForWindow; 

    public List<Harvest_Project> projectList; 

    public int selectedProjectid{get;set;} 

    public DayView(DateTime s) 
    { 
      InitializeComponent(); 
      this.DataContext = projectList; 
      //this.RootElement.DataContext = myData; 
      Globals._globalController.setDayViewWindow(this); 

      currentDateForWindow = s; 

      dayDateLabel.Content = s.DayOfWeek + ", " + s.Day; 
      monthLabel.Content = s.ToString("MMMM"); 

      listBox1.Items.Clear(); 

      //projectList = Globals._globalController.harvestManager._PROJECTLIST; 
      Globals._globalController.fetchAndPopulateForDate(currentDateForWindow);  
    } 

    public void addHarvestEntrytoView(Harvest_TimeSheetEntry entry) 
    { 
     try 
     { 
      listBox1.Items.Add(entry); 
     } 
     catch (Exception) 
     { } 
    } 

    public void addHarvestEntrytoView(List<Harvest_TimeSheetEntry> entry) 
    { 
     foreach (Harvest_TimeSheetEntry x in entry) 
      listBox1.Items.Add(x); 
    } 

    private void BackButton_Click(object sender, RoutedEventArgs e) 
    { 
      this.Hide(); 
      Globals._globalController.getMonthViewWindow.Show(); 
    } 

    private void StartButton_Click(object sender, RoutedEventArgs e) 
    { 
     Globals._globalController.win32Manager.startTimer(); 
    } 

    private void StopButton_Click_1(object sender, RoutedEventArgs e) 
    { 
     Globals._globalController.win32Manager.stopTimer(); 

    } 

    private void SyncEntry_Click(object sender, RoutedEventArgs e) 
    { 
     //Submit All unsynced Entries 
    } 

    private void ListBoxItem_MouseDoubleClick(object sender, RoutedEventArgs e) 
    { 
     //Submit clicked Entry 
     Harvest_TimeSheetEntry entryToPost = (Harvest_TimeSheetEntry)sender; 

     if (!entryToPost.isSynced) 
     { 
      //Check if something is selected in selectedProjectItem For that item 


      if (entryToPost.ProjectNameBinding == "Select Project") 
       MessageBox.Show("Please Select a Project for the Entry"); 
      else 
       Globals._globalController.harvestManager.postHarvestEntry(entryToPost); 
     } 
     else 
     { 
      //Already synced.. Make a noise or something 
      MessageBox.Show("Already Synced;TODO Play a Sound Instead"); 
     } 
    } 
} 
+3

Я считаю, что «ошибка BindingExpression путь: свойство„projectList“не найден на„объект“» ошибка жалуется, потому что 'projectList' в настоящее время не является свойством (не определено аксессоров). – Chris

+0

У вас также есть ошибка привязки для 'selectedProjectid'. Я считаю, что это потому, что вы забыли часть 'ElementName = MainWin' на этой привязке. –

+0

@Chris. Вы можете оставить свой комментарий в качестве ответа. – Clemens

ответ

6

как упоминался Крис, связывание просто работать с общественными свойствами описываемым. так что вы должны сделать, по крайней мере:

public List<Harvest_Project> projectList {get;set;} 

ваш XAML для ItemsSource {Binding Path = projectList, ElementName = MainWin} означает, что элемент MainWin имеет projectList собственности - я думаю, что это еще не то, что вы хотели.

EDIT: если у вас есть какие-либо обязательные ошибки есть только два простых шага, чтобы решить эту

  1. проверить DataContext
  2. проверить ваш обязательный путь

во время выполнения вы можете использовать Snoop для эта задача.

для вашей выбранной привязки к проекту: вы ожидаете, что DataContext с публичным свойством selectedProjectid. если это не так, вы должны проверить ваш код

2

Это, по существу, что blindmeis уже сказал, но я буду расширять на мой комментарий = D

Ваша ошибка: "BindingExpression path error: 'projectList' property not found on 'object' " является результатом отсутствующего определения свойства на ваш объект; в этом случае projectList в настоящее время не является собственностью (без определенных аксессуаров).

Вы должны также иметь другую общественную собственность, чтобы держать выбранный элемент (или значение в зависимости от того, что вы заинтересованы в.

public partial class DayView : MetroWindow 
{ 
    public List<Harvest_Project> projectList { get; set; } 
    public Harvest_Project selectedProject { get; set; } 

    // Your other code lives here. 
} 

Переплет вдоль этих линий (со всеми вашими именами элементов/контекстов по мере необходимости) :

<ComboBox x:Name="ComboBox2" 
    ItemsSource="{Binding Path=projectList}" 
    SelectedItem="{Binding Path=selectedProject}" Mode=TwoWay}" /> 

вы должны реализовать INotifyPropertyChanged, если вы хотите получать уведомления об изменениях SelectedItem, но это другая тема = D

4

Я хотел бы добавить к вышесказанному. У меня также была ошибка привязки.

System.Windows.Data Error: BindingExpression path error: 'GeneralInformationTopicSectionItemStyles' property not found on 'GeneralInformation.Resources.LocalizationFiles' 'GeneralInformation.Resources.LocalizationFiles' (HashCode=7180698). BindingExpression: Path='GeneralInformationTopicSectionItemStyles.ItemNameTextWithoutSectionFontWeight' DataItem='GeneralInformation.Resources.LocalizationFiles' (HashCode=7180698); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'FontWeight' (type 'System.Windows.FontWeight') 

И я не мог понять, в чем проблема. В моем классе LocalizationFiles у меня был член.

public static object GeneralInformationTopicSectionItemStyles; 

После прочтения вышеприведенного сообщения, я изменил это из члена в собственность.

public static object GeneralInformationTopicSectionItemStyles 
    { 
     get; 
     set; 
    } 

И Voila! Оно работало завораживающе.

MM

+0

Это, спасибо! –