选中/取消选中复选框后启用,禁用按钮

时间:2014-05-14 08:07:23

标签: c# wpf xaml

我有一个视图,其中包含一个列表框,其中包含按钮形式的各种项目以及每个按钮的复选框。 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”的按钮。它的基本功能是根据上面列表框项目中的选择启动任务,以便可以启动多个任务.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}}">

问题: 如果选择了至少一个项目,我想启用/禁用此启动按钮,否则禁用。我如何实现?请参考一些代码片段。

更新: 这是启动命令:

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中实现了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。这个容器视图模型是我添加UPDATE 2中提到的代码的地方

更新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被绑定到按钮以启用/禁用。

3 个答案:

答案 0 :(得分:1)

您可以根据Button属性启用/禁用CheckBox.IsChecked

<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}">

答案 1 :(得分:1)

我猜测启动按钮位于列表框之外,一旦复选框被选中,用户就会点击它。

在这种情况下,您需要在ICommand的“CanExecute”部分添加一个条件(LaunchCommand)

让我们假设您在构造函数中的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");
            }
        }

答案 2 :(得分:0)

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