2014-01-14 2 views
1
<ItemsControl DockPanel.Dock="Right" x:Name="Actions"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button x:Name="Action" 
        HorizontalAlignment="Right" 
        Content="{Binding Label}" 
        Margin="3" Width="30"></Button> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 

    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 

     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

выше мнение связывает с этим ViewModelCaliburn Действие не стреляя

public class DeploymentInputViewModel<T> : PropertyChangedBase 
{ 
    public BindableCollection<InputActionViewModel> Actions {get;set;} 
} 

Я вижу мои кнопки. Но при нажатии на него ничего не происходит.

В ViewModels для InputActionViewModel:

public abstract class InputActionViewModel{ 
    public InputActionViewModel() 
    { 

    } 
    public virtual Task Action() 
    { 
     return Task.FromResult<object>(null); 
    } 
    public string ActionToolTip { get; set; } 
    public string Label { get; set; } 

    public object Value { get; set; } 
} 

, а также

public class InputCertificateActionViewModel : InputActionViewModel 
{ 
    [Import] 
    private IShell _shell; 
    [Import] 
    private IWindowsDialogs _dialogs; 

    private readonly IDeploymentSettingInputViewModel vm; 
    public InputCertificateActionViewModel(IDeploymentSettingInputViewModel vm) 
    { 
     this.vm = vm; 
     Label = "..."; 
     ActionToolTip = "Pick a Certificate"; 
    } 

    public bool IsManagementCertificate {get;set;} 
    public bool IsDeploymentCertificate { get; set; } 
    public async override Task Action() 
    { 
     if(IsManagementCertificate) 
     { 
      var subs = await _shell.IdentityModel.GetEnabledSubscriptionsAsync(); 
      foreach(var sub in subs) 
      { 
       using (ManagementClient client = CloudContext.Clients.CreateManagementClient(sub.GetCredentials())) 
       { 
        var cert = _dialogs.SelectItemDialog("Select a certificate", "Pick one", true, 
         (await client.ManagementCertificates.ListAsync()).Select(c => 
          new SelectItem(c.Thumbprint, Encoding.Default.GetString(c.PublicKey), c, (s) => c.Thumbprint.Contains(s))).ToArray()) 
          .Tag as ManagementCertificateListResponse.SubscriptionCertificate; 
        this.vm.Value = cert.Thumbprint; 
       } 

      } 


     }else if(IsDeploymentCertificate) 
     { 

     } 



    } 
} 

Я добавляю actionViewModels вставляя непосредственно в наблюдаемом код при запуске.

haveActions.Actions.Add(DI.BuildUp(new InputCertificateActionViewModel(vm) 
{ 
    IsDeploymentCertificate = certAttribute.IsDeploymentCertificate, 
    IsManagementCertificate = certAttribute.IsManagementCertificate, 
})); 

haveActions является экземпляром InputCertificateActionViewModel

ответ

0

не могла вместить все это в комментарии:

Я не могу иметь быстрый взгляд на Caliburn.Micro в данный момент, но это может быть что-то связанные с вызовом вашего метода Action.

В догадка, хотя, я бы сказал, что по соглашению Caliburn.Micro рассчитывает найти метод, который соответствует Action<T> делегата использовать для его Actions, поэтому ваш public virtual Task Action() не будет располагаться и связанно.

Пройдите проверку, установив новый метод с совместимой сигнатурой, например public void MyMethod(), и проверьте, правильно ли он установлен и будет ли функционировать.

Если это проблема, вы, вероятно, захотите взглянуть на часть IResult and Coroutines части Caliburn.Micro documentation, которая, похоже, поможет вам реализовать желаемое поведение.

+0

Ye Метод, названный Action, был плохой идеей :) –

+0

Aha, приятно знать = D Так что вполне можно запустить метод 'public virtual Task NewName()'? Узнал что-то новое = D – Chris

+0

Ye, я изменил что-то abit также добавил сообщение для прикрепления, и вот как я заметил, что действие не работает, когда я изменил его на что-то вроде MyAction, тогда он сказал, что может найти метод My, если я правильно помню. –

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