与Caliburn.Micro一起使用的BooleanToVisibilityConverter的奇怪行为

时间:2014-11-24 19:25:23

标签: c# wpf caliburn.micro

在我的WPF应用程序中,我使用Caliburn.Micro(2.0.1)。在App.xaml中,我声明了BooleanToVisibilityConverter

<BooleanToVisibilityConverter x:Key="BoolToVis" />

现在当我想在我的一个视图中使用这个转换器时,我写了类似的东西

<Button x:Name="MyButton" Visibility="{Binding visibility,  Converter={StaticResource BoolToVis} }"/>

一切都很好但现在我必须在我的MainVeiew中使用这个转换器。此视图是我的主要观点。当应用程序启动它时抛出异常

System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

对我来说这很奇怪,因为如果我在我的观点中写作

<Window.Resources>
  <BooleanToVisibilityConverter x:Key="BoolToVis2" />
</Window.Resources>

并使用BoolToVis2而不是BoolToVis一切正常。这没关系,但我不明白这种行为。

applcation的示例代码:

的App.xaml

<Application x:Class="Test.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:Test"
         >
<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary>
                <local:AppBootstrapper x:Key="Bootstrapper" />
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
        <BooleanToVisibilityConverter x:Key="BoolToVis" />
    </ResourceDictionary>
</Application.Resources>
</Application>

AppBootstrapper

public class AppBootstrapper:BootstrapperBase
{
    public AppBootstrapper()
    {
        Initialize();
        DisplayRootViewFor<MainViewModel>();
    }
}

MainViewModel

public class MainViewModel : Screen
{
    bool _visibility;


    public bool Visibility
    {
        get { return _visibility; }
        set
        {
            _visibility = value;
            NotifyOfPropertyChange("Visibility");
        }
    }

    protected override void OnActivate()
    {
        base.OnActivate();
        Visibility = false;
    }
}

的MainView

<Window x:Class="Test.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainView" Height="300" Width="300">
<Grid>
    <Button x:Name="MyButton" Content="Test" Visibility="{Binding Visibility,  Converter={StaticResource BoolToVis}}" />
</Grid>

1 个答案:

答案 0 :(得分:1)

任何UIElement的Visibility属性都会从Visibility枚举器中获取值。 而不是使用布尔值使用Visible,Hidden或Collapsed。