2016-06-27 5 views
0

Я видел несколько подобных вопросов для моего, поэтому, пожалуйста, не ускользайте его. Сценарий здесь кажется другим, и я не понимаю, почему это было бы неправильно. Мои DataGrid имеют некоторые привязки к клавишам и щелчкам мыши:Ошибка пути BindingExpression: свойство '' не найдено в 'текущем элементе коллекции' ... BindingExpression: Path = /;

<DataGrid x:Name="gridStudents" ItemsSource="{Binding Source={StaticResource cvsStudentList}}" 
    Margin="2" 
    Height="250" 
    SelectedItem="{Binding SelectedStudentItem, UpdateSourceTrigger=PropertyChanged}" 
    AutoGenerateColumns="False" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" SelectionChanged="gridStudents_SelectionChanged"> 
    <DataGrid.InputBindings> 
     <MouseBinding 
      MouseAction="LeftDoubleClick" 
      Command="{Binding EditStudentButtonClickCommand}" 
      CommandParameter="{Binding /}" /> 
     <KeyBinding Key="Delete" Command="{Binding DeleteStudentButtonClickCommand}" /> 
    </DataGrid.InputBindings> 

я нашел методологию благодаря StackOverflow и существующим взносам пользователей. Очень признателен.

Эта проблема относится к MouseBinding CommandParameter. Программа отлично работает без предупреждений. Я могу дважды щелкнуть любую строку в DataGrid, и она будет вести себя так, как она была разработана.

Но если я проверяю Output окна в Visual Studio 2015 я могу видеть это замечание:

System.Windows.Data Error: 40 : BindingExpression path error: '' property not found on 'current item of collection' ''OCLMEditorModelView' (HashCode=43686667)'. BindingExpression:Path=/; DataItem='OCLMEditorModelView' (HashCode=43686667); target element is 'MouseBinding' (HashCode=49684624); target property is 'CommandParameter' (type 'Object')

Почему это говорит? Я использовал /, потому что ItemSource - это объект CollectionViewSource, и я понял, что/вызывает выбранный элемент. Но эта команда не должна срабатывать, пока я на самом деле дважды не щелкнул строку.

Любопытно, как я могу остановить это появление в моем окне вывода.

Если я пытаюсь изменить связывание в соответствии с ответом я получаю это исключение:

Exception error

Update:

Вот текущий XAML:

<MouseBinding 
    MouseAction="LeftDoubleClick" 
    Command="{Binding EditStudentButtonClickCommand}" 
    CommandParameter="{Binding /, Source={RelativeSource Self}}" /> 

Но теперь Я замечаю это в окне вывода:

System.Windows.Data Error: 40 : BindingExpression path error: '' property not found on 'current item of collection' ''RelativeSource' (HashCode=472027)'. BindingExpression:Path=/; DataItem='RelativeSource' (HashCode=472027); target element is 'MouseBinding' (HashCode=36454430); target property is 'CommandParameter' (type 'Object')

Кажется, что это работает (я могу дважды щелкнуть строку, и она делает то, что я хочу). Могу ли я остановить это предупреждение вывода?

Update:

Так это текущий XAML:

<DataGrid x:Name="gridStudents" ItemsSource="{Binding StudentsView}" 
    Margin="2" 
    Height="250" 
    SelectedItem="{Binding SelectedStudentItem, UpdateSourceTrigger=PropertyChanged}" 
    AutoGenerateColumns="False" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" SelectionChanged="gridStudents_SelectionChanged"> 
    <DataGrid.InputBindings> 
     <MouseBinding 
      MouseAction="LeftDoubleClick" 
      Command="{Binding EditStudentButtonClickCommand}" 
      CommandParameter="{Binding /, Source={RelativeSource Self}}" /> 
     <KeyBinding Key="Delete" Command="{Binding DeleteStudentButtonClickCommand}" /> 
    </DataGrid.InputBindings> 
    <DataGrid.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
     </Style> 
    </DataGrid.CellStyle> 

Что я tryign делать не изменилось - когда пользователь дважды щелкает DataGrid строку (которая boudn к CVS) он вызывает команду, основанную на этой строке.

+0

Не используйте 'Convert.ChangeType', просто напишите параметр' (T)'. –

+0

Расширение 'RelativeSource' * действует только для свойства' RelativeSource' * *, а не 'Source'. Также 'RelativeSource Self' будет ссылаться на' MouseBinding', который, безусловно, не является вашей коллекцией, что вы даже делаете ... –

+0

@ H.B. Обновленный вопрос (внизу). –

ответ

2

В контексте привязок ввода вашего DataContext не изменились, так что я бы ожидать, что правильное связывание быть:

CommandParameter="{Binding Path=/, Source={StaticResource cvsStudentList}}" 

Кроме этого вы можете также связываться с SelectedItem через RelativeSource, который должен быть эквивалентным.

CommandParameter="{Binding Path=SelectedItem, 
          RelativeSource={RelativeSource AncestorType=DataGrid}}" 
+0

Спасибо. Если я попробую этот первый подход со статическим ресурсом, я получаю исключение при двойном щелчке. –

+0

«исключение» не очень полезно. Вопрос заключается в том, работает ли сама привязка и что именно ожидает реализация команды в качестве параметра. –

+0

Я не могу этого сделать. Параметр - текущий ** элемент ** в источнике cvs. Я добавлю исключение, которое я получу на свой вопрос. Все, что я знаю, это то, что я должен просто использовать/один, и он работает. Но я получаю это молчаливое исключение. Если я играю с привязками, как описано, я получаю исключение. Можете ли вы, пожалуйста, показать мне в своем ответе идею SelectedItem, которую вы упомянули? Благодарю. –