caliburn.micro绑定元素对viewmodel函数的可见性,而不是属性

Kob*_*kel 3 c# wpf xaml binding caliburn.micro

首先 - 我很抱歉,如果它是重复的 - 已经看了一会儿,但找不到答案,

我们正在使用caliburn.micro,因此解决方案必须使用此工具.

我们有一个由9个按钮组成的视图 - 然而 - 并非所有按钮都可以在同一时间看到,它取决于系统上的事件.每个按钮的可见性根据当前状态可见或折叠,但由于它是大量按钮,并且将来可能会增加,我宁愿只有一个功能来执行此操作(接收名称或枚举并返回可见性)而不是有大量的属性来绑定每个按钮.

它甚至是一种选择吗?我似乎找不到以任何传统方式做到这一点的方法.

由于事件是从软件外部接收的,我们正在开发这样做在视图级别上实际上不是一个选项(或者至少 - 不是正确的)

编辑:这是我想要修改的视图的片段:

            <Grid Margin="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>

                <uiviews:PhonePadView Grid.Column="0" x:Name="DestinationDn" cal:Bind.Model="UI.ViewModels.PhonePadViewModel" />

                <Button  Grid.Column="1" Content="Dial" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="MakeCall" Visibility="{Binding btnMakeCallVisibility}" />
                <Button  Grid.Column="1" Content="Answer" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="AnswerCall" Visibility="{Binding btnAnswerCallVisibility}" />
                <Button  Grid.Column="1" Content="Hang-up" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="ReleaseCall" Visibility="{Binding btnReleaseCallVisibility}" />
                <Button  Grid.Column="1" Content="Hold" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="HoldCall" Visibility="{Binding btnHoldCallVisibility}" />

            </Grid>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我需要为每个按钮设置不同的属性,我拒绝相信这是唯一的方法,我确实有一个属性保持当前状态(电话响铃,通话,拨号等. )并且很容易在VM上有一个功能来告诉哪个按钮应该是可见的,哪个不应该是可见的,最重要的是我们当前有9个按钮,但它可能很容易扩展更多,所以我正在寻找这里有大多数模块化代码

Eri*_*rer 9

开箱即用,如果您使用"IsVisible"后缀命名,Caliburn Micro将切换可见性.

在视图上:

<Grid Name="ConfigEditorIsVisible">
    <TextBlock>Test</TextBlock>
</Grid>
Run Code Online (Sandbox Code Playgroud)

在ViewModel上:

public bool ConfigEditorIsVisible { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 它必须位于 Grid 或 StackPanel(我猜是 WrapPanel)上,而不是直接位于控件上,然后应将其放入容器内。答案是正确的,这只是一个声明。 (3认同)

Kob*_*kel 0

所以...最后这就是我所做的:在虚拟机上:

    private HashSet<string> actionsEnabledSet = null;
    public HashSet<string> ActionsEnabledSet
    {
        get { return actionsEnabledSet; }
        set
        {
            actionsEnabledSet = value;
            NotifyOfPropertyChange(() => ActionsEnabledSet);
        }
    }
Run Code Online (Sandbox Code Playgroud)

除了根据我希望可见的项目更改哈希集之外。

具有转换功能的(多)转换器:

    public object Convert(object[] value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
    {
        if (value[0].GetType() == typeof(HashSet<string>))
        {
            if (value[1].GetType() == typeof(string))
            {
                if (((HashSet<string>)value[0]).Contains((string)value[1]))
                    return Visibility.Visible;
            }
        }
        return Visibility.Collapsed;
    }
Run Code Online (Sandbox Code Playgroud)

查看按钮样式:(为了尽可能避免重复的代码)

    <Style TargetType="Button" x:Key="PhonePadBasicFunctionsButtons" >
        <Setter Property="Margin" Value="0,0,0,0" />
        <Setter Property="Focusable" Value="False" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="Width" Value="75" />
        <Setter Property="Visibility">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource PhoneActionVisibilityConverter1}">
                    <Binding Path="ActionsEnabledSet" Mode="OneWay"/>
                    <Binding RelativeSource="{RelativeSource Self}" Path="Tag" />
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
Run Code Online (Sandbox Code Playgroud)

按钮的堆栈面板如下所示:

                <Button  Content="Call" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="MakeCall" Tag="MakeCall" cal:Message.Attach="MakeCall" />
                <Button  Content="Answer" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="AnswerCall" Tag="AnswerCall" cal:Message.Attach="AnswerCall" />
Run Code Online (Sandbox Code Playgroud)

真的很恼火,我找不到将“标签”绑定到“x:name”的方法,但是添加新按钮就像添加一行一样简单,而且以这种方式编写代码感觉更好,很想有任何想法关于如何做得更好,我认为它很优雅,但我有一种感觉它可以更容易阅读/实现。

我必须使用多重绑定,因为使用 covnerterproperty 不是一个选项 - 你不能将元素绑定到属性,因为看起来,希望这对将来的某人有所帮助 - 是一个很好的挑战:)

感谢所有试图提供帮助的人 - 你们让我走出了困境,真正寻找答案!