2014-05-14 184 views
0

我有一个视图,其中包含按钮形式的各种项目和每个按钮的复选框。 XAML:勾选/取消勾选复选框时启用,禁用按钮

 <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <CheckBox x:Name="CheckFavorite" 
           Width="Auto" 
           Height="Auto" 
           AutomationProperties.AutomationId="AID_FavoritesCheck" 
           IsChecked="{Binding Path=IsChecked, 
                Mode=TwoWay}" 
           Visibility="{Binding IsFavoriteConfiguredAndInDA, 
                Converter={StaticResource boolToVisibility}}" 
           Checked="OnContentChanged" 
           Unchecked="OnContentChanged"/> 
        <Button Grid.Column="1" 
          Width="240" 
          HorizontalContentAlignment="Left" 
          VerticalContentAlignment="Center" 
          AutomationProperties.AutomationId="AID_BtnLaunchFavorite" 
          Command="{Binding Path=LaunchFavorite}" 
          Content="{Binding Path=ModuleDisplayName}" 
          Cursor="Hand" 
          FontSize="{StaticResource UxLevel_5}" 
          Padding="24 12 2 12" 
          ToolTip="{Binding Path=ModuleDisplayName}" /> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 

我有另一个叫做“Launch”的按钮。它的基本功能是发射任务按选择在上面的列表框项目,使多个任务可以launched.Button XAML:

 <Button Name="btnLaunch" 
       Width="80" 
       Height="25" 
       HorizontalAlignment="Left" 
       AutomationProperties.AutomationId="AUI_BtnLaunchForFavorite" 
       Command="{Binding LaunchCommand}" 
       Style="{StaticResource LaunchButtonStyle}" 
       Visibility="{Binding IsRIAMode, 
            Converter={StaticResource boolToVisibilityInverter}}"> 

问题: 我想启用/如果ATLEAST一个禁用此启动按钮项目被选中并禁用其他方式。我可以如何实现?请帮助一些代码片段。

UPDATE: 这里是启动命令:

public ICommand LaunchCommand { get; private set; } 
LaunchCommand = new DelegateCommand<object>(OnLaunch); 
     internal void OnLaunch(object sender) 
     { 
      var nFavItemToLaunchCount = Favorites.Count(favItem => favItem.IsChecked); 

      if (!IsSessionLimitReached(nFavItemToLaunchCount)) 
      { 
       foreach (FavoriteItemViewModel favoriteItem in Favorites) 
       { 
        if (favoriteItem.IsChecked) 
        { 
         favoriteItem.LaunchFavorite.Execute(sender); 

        } 
       } 
      } 
     } 

更新2:

我所做的更改按克里希纳的评论:

LaunchCommand = new DelegateCommand<object>(OnLaunch,ToggleLaunch); 
private bool ToggleLaunch(object obj) 
{ 

     if (Favorites.Count(i => i.IsChecked)!=0) //Favorites is the itemsource 
     { 
       return true; 
     } 
      return false; 
} 

尽管如此发射按钮显示禁用即使在选择/检查项目时也是如此。

更新3

Krishna的进一步的评论之后,我改变了性质的器isChecked实施以及在实施viewmodel.Still没有INotifyPropertyChanged的运气!

public class FavoriteItemViewModel:INotifyPropertyChanged 
{ 
     public bool IsChecked 
     { 
      get 
      { 
       return m_IsChecked; 
      } 
      set 
      { 
       m_IsChecked = value; 
       OnPropertyChanged("IsChecked"); 
      } 
     } 

     /// <summary> 
     /// Handler for property change 
     /// </summary> 
     /// <param name="propertyName">Name of property</param> 
     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
} 

还有另一种视图模型“FavoriteContainerViewModel”持有“FavoriteItemViewModel”的集合,也实现INotifyPropertyChanged。此容器视图模型是其中i加入UPDATE提到的代码的地点2

UPDATE 4: 执行收藏:

public class FavoriteContainerViewModel : ViewModelBase, IModuleView 
{ 
    private readonly ObservableCollection<FavoriteItemViewModel> m_Favorites = new ObservableCollection<FavoriteItemViewModel>(); 

     public ObservableCollection<FavoriteItemViewModel> Favorites 
     { 
      get { return m_Favorites; } 
     } 
     public FavoriteContainerViewModel() 
     { 
      LaunchCommand = new DelegateCommand<object>(OnLaunch, ToggleLaunch); 
      OnLoad(); 
     } 
     private bool ToggleLaunch(object obj) 
     { 
      if (Favorites.Count(i => i.IsChecked) != 0) 
      { 
       return true; 
      } 
      return false; 
      //return true; 
     } 
} 

注:ViewModelBase实现INotifyPropertyChanged

更新5: 问题现在使用基于事件的模型解决。实现以下几点: FavoriteViewModel.cs

public event EventHandler ItemChecked; 
public bool IsChecked 
{ 
    get 
    { 
     return m_IsChecked; 
    } 
    set 
    { 
     m_IsChecked = value; 
     if (ItemChecked != null) 
     { 
      ItemChecked(this, new EventArgs()); 
     } 
    } 
} 

FavoriteItemContainerViewModel.cs

private void SubscribeFavoriteItemEvents(FavoriteItemViewModel favorite) 
{ 
    favorite.ItemChecked += ToggleLaunchButton; 
} 

private bool m_IsLaunchEnabled; 
public bool IsLaunchEnabled 
{ 
    get 
    { 
     return m_IsLaunchEnabled; 
    } 
    set 
    { 
     m_IsLaunchEnabled = value; 
     OnPropertyChanged("IsLaunchEnabled"); 
    } 
} 

物业IsLaunchEnabled被绑定到按钮启用/禁用。

+0

什么是'LaunchCommand'? – amnezjak

+0

单击此按钮启动LaunchCommand并启动选定的任务。 – Sandeep

+0

是的,但是它的实例是什么类?你自己的'ICommand'实现还是一些工具包类?你有'CanExecute'方法吗?如果是这样,启用/禁用该方法中的按钮。 – amnezjak

回答

1

您可以启用/禁用基础上,CheckBox.IsChecked属性Button

<Button Name="btnLaunch" 
       Width="80" 
       Height="25" 
       HorizontalAlignment="Left" 
       AutomationProperties.AutomationId="AUI_BtnLaunchForFavorite" 
       Command="{Binding LaunchCommand}" 
       Style="{StaticResource LaunchButtonStyle}" 
       Visibility="{Binding IsRIAMode, 
            Converter={StaticResource boolToVisibilityInverter}}" 
       IsEnabled="{Binding ElementName=CheckFavorite, Path=IsChecked}"> 
+0

这是行不通的 – Sandeep

+0

在同一个可视化树中是否有'Button'和'Checkbox'? –

+0

不,复选框是列表框的一部分,而按钮是完全不同的堆栈面板 – Sandeep

0
if (checkbox1.Checked && !checkbox2.Checked) 
    { 
     button1.Enable = true 
    } 
    else if (!checkbox1.Checked && checkbox2.Checked) 
    { 
     button1.Enable = false 
    } 
1

我猜发射按钮是列表框之外,用户点击一次的复选框被选中。

在这种情况下,你需要在你的ICommand(LaunchCommand)的“CanExecute”部分

让我们假设在构造函数中的ICommand的实现添加一个条件是一样的东西

LaunchCommand = new RelayCommand(launchMethod); 
private void launchMethod(object obj) 
{ 
//do some work here 
} 

现在添加canExecute一部分,你的命令通过改变初始化

LaunchCommand = new DelegateCommand<object>(OnLaunch,checkCheckboxes); 

,并添加这个方法

private bool checkCheckboxes(object obj) 
{ 
    //YourList is your itemsource 
    return YourList.Where(i=>i.IsChecked).Any(); 
} 

只需更改上面的方法来满足您的需求

更新您的财产器isChecked更改为以下

private bool isChecked; 
     public bool IsChecked 
     { 
      get { return isChecked; } 
      set 
      { 
       isChecked = value; 
       OnPropertyChanged("IsChecked"); 
      } 
     } 
+0

请参阅我的更新启动命令 – Sandeep

+0

然后更改您的实现像LaunchCommand = new DelegateCommand (OnLaunch,checkCheckboxes);并添加我的方法在我的帖子中提到checkCheckboxes。您只需确保至少检查一个项目,如果是,则返回true,如果没有项目被选中,则返回false。这将启用和禁用您的启动按钮自动 – Krishna

+0

您可以请帮我与代码片段检查至少一个选定的项目?我是WPF的新手 – Sandeep