wpf 如何在“导体集合”设置为“所有活动”时停用中的项目

s3fp2yjn  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(175)

停用已在ContentControl标记中定义的ViewModel时遇到问题。我不想将Visibility设置为false,因为这似乎是不合适的解决方案。
这是它的外观,似乎在AllActive中,我们不需要激活每个项目:

<ContentControl Grid.Column="0" cal:View.Model="{Binding RandomScreenViewModel}"/>

这是在Conductor的“OneActive”模式下的外观。然后我们可以调用ActivateItem和DeactivateItem,其中Deactivate将实际关闭内容:

<ContentControl Grid.Column="0" x:Name="ActiveItem"}"/>

我希望激活的项目在AllActive期间关闭。这甚至是可能的吗?在我看来,它应该是可能的,从AllActive删除一个项目。
我有点n00b对使用导体,所以我希望任何人可以帮助我这一点。:D
ShellView.xaml:

Window x:Class="SimpleConductorOneActive.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cal="http://www.caliburnproject.org"
        xmlns:local="clr-namespace:SimpleConductorOneActive.ViewModels"
        Title="MainWindow" Height="350" Width="550" Background="CornflowerBlue">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Grid.Row="0">
            <Button Content="New Screen" x:Name="NewScreen" />
            <TextBlock Text="Current Screen Count:" VerticalAlignment="Center" Padding="10,5,2,5"/>
            <TextBlock Text="{Binding Items.Count}" VerticalAlignment="Center" Padding="0,5,5,5"/>
        </StackPanel>
        <ContentControl Grid.Row="1" cal:View.Model="{Binding RandomScreenViewModel}" HorizontalAlignment="Center"  VerticalAlignment="Center"  Height="200" Width="180" Margin="342,0,20,10" Padding="5"/>

        <ListBox x:Name='Items' Grid.Row="2">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" Width="60" Margin="5">
                        <TextBlock Text="Screen Id" FontWeight="Bold"  />
                        <TextBlock Text='{Binding DisplayName}'  
                                   Margin='5 5 5 5'   
                                   Padding="5 5 5 5"
                                   FontSize='12' 
                                   TextWrapping="NoWrap"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation='Horizontal' />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>

    </Grid>
</Window>

ShellViewModel.cs:

public class ShellViewModel : Conductor<object>.Collection.AllActive
{

    public RandomScreenViewModel RandomScreenViewModel { get; set; }

    public int ScreenCount
    {
        get { return Items.Count; }
    }

    public ShellViewModel()
    {
        RandomScreenViewModel = new RandomScreenViewModel();
        NewScreen();
    }

    public void NewScreen()
    {
        ActivateItem(RandomScreenViewModel);
    }
}

RandomScreenView.xaml:

<UserControl x:Class="SimpleConductorOneActive.Views.RandomScreenView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="AliceBlue">
        <StackPanel Orientation="Vertical">
            <Button Content="Close" HorizontalAlignment="Right" Margin="5" x:Name="CloseScreen" />
            <TextBlock Text="Name:"/>
            <TextBlock x:Name="DisplayName"/>

        </StackPanel>
    </Grid>
</UserControl>

RandomScreenViewModel.cs:

public class RandomScreenViewModel:Screen
    {
        public RandomScreenViewModel()
        {
            Guid id = Guid.NewGuid();
            DisplayName = id.ToString();
        }

        public void CloseScreen()
        {
            base.TryClose();
        }

    }
hmae6n7t

hmae6n7t1#

我是新的WPF,Caliburn微,我从来没有使用过Conductor<T>.Collection.AllActive在真实的的应用程序,但我已经尝试了一点.当你把它添加到Items,这是屏幕集合,所有的都被激活.
如果你想去激活它,你可以简单地使用DeactivateItem(T item, bool close)方法,获取你正在进行的项目,bool表示你也想关闭它。
这是一段代码。

** shell 视图模型.cs**

public void Remove()
{
    if (Items.Count > 0)
    {
        DeactivateItem(Items[0], true);
    }
}

** shell 视图.xaml**

<ItemsControl x:Name="Items" />
<Button cal:Message.Attach="Remove"
        Width="50"
        Content="Deactive" />

当删除Items中的项时,ShellView将得到更新,因为Items是实现INotifyCollectionChangedIObservableCollection<T>类型。我只尝试将Items与ItemsControl绑定,但另一个控件也应该能够筛选集合(我不知道XD)

e0uiprwp

e0uiprwp2#

在代码隐藏中,您可以将ViewModel的IsEnabled值设置为false。我知道您说过您不想将visibility设置为false,但您可以将visibility设置为Collapsed。此解决方案将在输出中完全隐藏它。
当你想在代码背后做这件事时,你需要做:

yourObject.Visibility = Visibility.Collapsed;
mzsu5hc0

mzsu5hc03#

我发现自己也在尝试做同样的事情,并使用making the porperty = null解决了这个问题
shell 视图模型签名

public class ShellViewModel : Conductor<object>.Collection.OneActive

public class ShellViewModel : Conductor<object>.Collection.AllActive

属性

private Screen _mainActiveView;
    public Screen MainActiveView
    {
        get { return _mainActiveView; }
        set { _mainActiveView = value;
            NotifyOfPropertyChange(() => MainActiveView);
        }
    }

    private Screen _footerActiveItem;
    public Screen FooterActiveItem
    {
        get { return _footerActiveItem; }
        set { _footerActiveItem = value;
            NotifyOfPropertyChange(() => FooterActiveItem);
        }
    }

Shell查看相关信息:

<ContentControl x:Name="MainActiveView"/>
<ContentControl x:Name="FooterActiveItem" />

方法来停用项并将其从视图中消除

public void closeFooter(){
      DeactivateItemAsync(FooterActiveItem,true)
      FooterActiveItem  = null
}

我不确定这是否是正确的方法,也不知道这样做的意义

相关问题