2015-05-22 7 views
1

У меня есть мнение, что МОФ имеет Telerik: RadListBox с ContextMenu, связанный с каждым элементом определяется какНе удается связать правильно команду ViewModel

<DataTemplate x:Key="ListBoxItemTemplate"> 
     <Grid > 
      <telerik:RadContextMenu.ContextMenu> 
       <telerik:RadContextMenu x:Name="ContextMenu" > 
        <!--cal:Action.TargetWithoutContext="{Binding}"--> 
        <!--TOREFACTOR cal:Message.Attach="Reconnect()" IsEnabled="{Binding IsAlive, Converter={StaticResource invertBooleanConverter}}"--> 
        <telerik:RadContextMenu.Items> 
         <telerik:RadMenuItem Header="{x:Static resources:CommonResources.LBL_RECONNECT}"> 
          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="Click"> 
            <catel:EventToCommand Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type telerik:RadListBox}}, Path=DataContext.Reconnect}" ></catel:EventToCommand> 
           </i:EventTrigger> 
          </i:Interaction.Triggers> 
          <telerik:RadMenuItem.IconTemplate> 
           <DataTemplate> 
            <Image Source="/IF.Tesoreria.Client.WPF;component/Media/reconnect.png" Width="13" Height="13"/> 
           </DataTemplate> 
          </telerik:RadMenuItem.IconTemplate> 
         </telerik:RadMenuItem> 
        </telerik:RadContextMenu.Items> 
       </telerik:RadContextMenu> 
      </telerik:RadContextMenu.ContextMenu> 
      <Grid.ToolTip> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition></RowDefinition> 
         <RowDefinition></RowDefinition> 
         <RowDefinition></RowDefinition> 
        </Grid.RowDefinitions> 

        <Grid.ColumnDefinitions> 
         <ColumnDefinition></ColumnDefinition> 
         <ColumnDefinition></ColumnDefinition> 
        </Grid.ColumnDefinitions> 

        <TextBlock Grid.Row="0" Text="Host:"></TextBlock> 
        <TextBlock Grid.Row="1" Text="Port:"></TextBlock> 
        <TextBlock Grid.Row="2" Text="Last Beat:"></TextBlock> 

        <TextBlock Grid.Row="0" Grid.Column="1" Margin="5,0,0,0" Text="{Binding Host}"></TextBlock> 
        <TextBlock Grid.Row="1" Grid.Column="1" Margin="5,0,0,0" Text="{Binding Port}"></TextBlock> 
        <TextBlock Grid.Row="2" Grid.Column="1" Margin="5,0,0,0" Text="{Binding LastHeartBeat, Converter={StaticResource dateTimeToStringConverter}, ConverterParameter=HH:mm:ss}"></TextBlock> 
       </Grid> 
      </Grid.ToolTip> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Image Source="{Binding IsAlive, Converter={StaticResource statusToBulletIconConverter}}" Margin="10 0 0 0" Width="16" Height="16" Grid.Column="0" 
        HorizontalAlignment="Left"> 
      </Image> 
      <TextBlock Text="{Binding Description}" FontSize="12" FontFamily="Segoe UI" Grid.Column="1" Margin="10 0 0 0" HorizontalAlignment="Left" /> 
     </Grid> 
    </DataTemplate> 
<!--omiss-->  
<Grid> 
    <telerik:RadListBox x:Name="listBox" ItemsSource="{Binding ServerList}" ItemTemplate="{StaticResource ListBoxItemTemplate}"/> 
</Grid> 

и в моем ViewModel Я

public ServerMonitorViewModel(IMonitorService moonitorService) 
    { 
     Reconnect = new Command<object>(OnReconnectExecute); 
    } 

    #region Commands 
    public Command<object> Reconnect { get; private set; } 
    #endregion 

    private void OnReconnectExecute(object obj) 
    { 
     MessageBox.Show("ok"); 

    } 

ошибка я получил это

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Telerik.Windows.Controls.RadListBox', AncestorLevel='1''. BindingExpression:Path=DataContext.Reconnect; DataItem=null; target element is 'EventToCommand' (HashCode=46922521); target property is 'Command' (type 'ICommand') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Telerik.Windows.Controls.RadListBox', AncestorLevel='1''. BindingExpression:Path=DataContext.Reconnect; DataItem=null; target element is 'EventToCommand' (HashCode=19649510); target property is 'Command' (type 'ICommand') 

Я пытался не ставить RelativeSource, но это выглядит для команды внутри моей границы (элемент, привязанный к списку)

Как его исправить? Thanks

+1

ContextMenu принимает DataContext от ItemsControl и поэтому он не может получить доступ к ViewModel непосредственно. Также он не является частью VisualTree, поэтому вы не можете выполнять привязку RelativeSource. См. Мой пост http://stackoverflow.com/questions/30104193/how-to-bind-command-into-contextmenu-in-datatemplate/30105635#30105635 –

ответ

1

Переключатель света избил меня по причине, используйте это вместо этого.

Command="{Binding DataContext.Reconnect, ElementName=listBox}" 

Here is a related question

+0

Я всегда получаю System.Windows.Data Ошибка: 4: Не могу найти источник для привязки со ссылкой «ElementName = listBox». BindingExpression: Path = DataContext.Reconnect; DataItem = NULL; целевой элемент - «EventToCommand» (HashCode = 19341321); target - «Command» (тип «ICommand») Ошибка System.Windows.Data: 4: Не удается найти источник для привязки со ссылкой «ElementName = listBox». BindingExpression: Path = DataContext.Reconnect; DataItem = NULL; целевой элемент - «EventToCommand» (HashCode = 8260362); target является «Command» (тип «ICommand») – advapi

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