隐藏在WPF列表框项目(Hiding A Listbox Item in WPF)

2019-10-19 14:55发布

我有填充了几个ListBox中项的ListBox控件。 每个项都包含一个“继续”按钮和“推迟”按钮。 我愿再次“推迟”按键来隐藏列表框项目(如呈现在我的情况下,行)。 我目前的代码似乎并没有产生任何影响。

XAML:

<ListBox.ItemContainerStyle>
         <Style TargetType="{x:Type ListBoxItem}">
               <Style.Triggers>
                   <DataTrigger Binding="{Binding PostponeClicked}" Value="1">
                       <Setter Property="IsEnabled" Value="False"/>
                   </DataTrigger>
                </Style.Triggers>
         </Style>
</ListBox.ItemContainerStyle>

C#:

 private void PostponeThirdPartyUpdatesButton_Click(object sender, RoutedEventArgs e)
    {
        DataTrigger d = new DataTrigger();
        d.Binding = new Binding("PostponeClicked");
        d.Value = 1;

        var context = ((FrameworkElement)sender).DataContext as Tuple<RegScan_ThirdParty.InstalledApplicationFromRegistryScan, RegScan_ThirdParty.ManifestRequiredApplication, RegScan_ThirdParty.RequiredApplicationState>;

        Button ThirdPartyPostponeButton = sender as Button;
        ThirdPartyPostponeButton.IsEnabled = false;

        if (context != null)
        {
            RegScan_ThirdParty.registryApplicationPostponeWorkflow(context);
        }

        ThirdPartyPostponeButton.IsEnabled = true;

    }

Answer 1:

我必须解决同样的事情一次。 在列表框中每个项目应该是一个对象。 我们叫它MyObject现在,因为我不知道你的对象类型是什么。 在为MyObject类,你把你的继续和推迟的命令。

//ViewModelBase implements INotifyPropertyChanged, which allows us to call RaisePropertyChanged, and have the UI update
class MyObject : ViewModelBase
{
    private bool isNotPostponed = true;
    public bool IsNotPostponed
    {
        get { return isNotPostponed; }
        set 
        { 
            isNotPostponed = value; 
            RaisePropertyChanged("IsNotPostponed");
        }
    }

    private Command postponeCommand;
    public Command PostponeCommand
    {

        get 
        {
            if (postponeCommand == null)
                postponeCommand = new Command(PostponeCommand);
            return postponeCommand; 
        }

    }

    private void Postpone(object x)
    {
        IsNotPostponed = false;
    }

    //similar code for Proceed Command
}

然后在显示列表框中的视图的视图模型,创建可以绑定到你的列表框(或其他征收要使用)的列表。 我把它叫做在下面的XAML MyObjectsList。 (我不显示视图模型代码中这个对象的生活,但我以为你有绑定到ListBox的代码。)然后在你的ItemsControl.ItemTemplate,绑定到列表中的每个MyObject来。

<ItemsControl ItemsSource="{Binding MyObjectsList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <DataTemplate.Resources>
                <BooleanToVisibilityConverter x:Key="boolToVis"/>
            </DataTemplate.Resources>
            <StackPanel Visibility="{Binding IsNotPostponed, Converter={StaticResource boolToVis}}">
                <Button Command="{Binding PostponeCommand}" Content="Postpone"/>
                <Button Command="{Binding ProceedCommand}" Content="Proceed"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

当推迟被点击时,该命令将执行推迟(),其将设置IsNotPostponed为false。 在IsNotPostponed设置为false,RaisePropertyChanged告诉IsNotPostponed改变UI(您需要实现INotifyPropertyChanged接口。)最后,当UI得到变更通知,将其转换的布尔的能见度。 真=>可见,假=>崩溃了。



文章来源: Hiding A Listbox Item in WPF