BooleanToVisibilityConverter 适用于 Textblock 而不是 UserControl
BooleanToVisibilityConverter works on Textblock and not on UserControl
我正在做一个 windows phone 项目。
我对我的 xaml.
有一些不太了解的地方
这里是:
<Page
x:Class="CitiBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="using:CitiBox.Converters"
xmlns:views="using:CitiBox.Views"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Page.Resources>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>
<Grid>
<!--<TextBlock Text="Test1" Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBlock Text="Test2" Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>-->
<views:LoadingView Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<views:DrawerView Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</Grid>
</Page>
如您所见,有两个注释的文本块和两个视图(用户控件)。您还可以看到,我使用 BooleanToVisibilityConverter 将这四个元素的可见性绑定到两个布尔值。
令我惊讶的是,如果我用两个文本块测试这段代码,它就可以工作,如果我用视图尝试它,它就不行。我的视图只包含一个带有消息的文本块,没什么特别的..
这是它们的样子:
<UserControl
x:Class="CitiBox.Views.LoadingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CitiBox.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
DataContext="{Binding Loading, Source={StaticResource Locator}}">
<Grid>
<TextBlock Text="Loading!!"/>
</Grid>
</UserControl>
你知道它可能是什么吗?
提前致谢,
纪尧姆
在您的 UserControl
中,您明确设置了 DataContext
。
DataContext="{Binding Loading, Source={StaticResource Locator}}"
这意味着以下绑定将不起作用:
Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"
原因是因为绑定正在 UserControl 的 当前 DataContext 中寻找 Test2
。相反,您需要在 父控件的 DataContext.
中寻找 Test2
试试这个:
Visibility="{Binding DataContext.Test2, RelativeSource={RelativeSource AncestorType=Page}, Converter={StaticResource BooleanToVisibilityConverter}}"
我认为你的问题是 DataContext
因为页面 DataContext 是
DataContext="{Binding Main, Source={StaticResource Locator}}"
当您将 usercontrol dataContext 设置为 DataContext="{Binding Loading, Source={StaticResource Locator}}"
尝试像这样更改您的代码
<Page x:Class="CitiBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="using:CitiBox.Converters"
xmlns:views="using:CitiBox.Views"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{Binding Main, Source={StaticResource Locator}}"
x:Name="Page">
<Page.Resources>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>
<Grid>
<!--<TextBlock Text="Test1" Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBlock Text="Test2" Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>-->
<views:LoadingView Visibility="{Binding ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<views:DrawerView Visibility="{Binding ElementName=Page,Path=DataContext.Test1, Converter={StaticResourceBooleanToVisibilityConverter}}"/>
</Grid>
</Page>
问题出在DataContext的使用上。您的 MainPage
有一个 DataContext :
DataContext="{Binding Main, Source={StaticResource Locator}}"
LoadingView 还有一个 DataContext
因此,当您编写这段代码时:
您尝试在 LoadingView 的 DataContext 中查找 Test2
作为字段,因为您在同一个视图中。为避免这种行为,您可以尝试这样做:
<views:LoadingView Visibility="{Binding ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
或者你可以写一个class调用NavigationService
继承自INavigationService
(MVVM Light)
您项目中的每个视图都是一个页面,您将成为所有页面之间的过渡(如淡入淡出)
我正在做一个 windows phone 项目。 我对我的 xaml.
有一些不太了解的地方这里是:
<Page
x:Class="CitiBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="using:CitiBox.Converters"
xmlns:views="using:CitiBox.Views"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Page.Resources>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>
<Grid>
<!--<TextBlock Text="Test1" Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBlock Text="Test2" Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>-->
<views:LoadingView Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<views:DrawerView Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</Grid>
</Page>
如您所见,有两个注释的文本块和两个视图(用户控件)。您还可以看到,我使用 BooleanToVisibilityConverter 将这四个元素的可见性绑定到两个布尔值。
令我惊讶的是,如果我用两个文本块测试这段代码,它就可以工作,如果我用视图尝试它,它就不行。我的视图只包含一个带有消息的文本块,没什么特别的..
这是它们的样子:
<UserControl
x:Class="CitiBox.Views.LoadingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CitiBox.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
DataContext="{Binding Loading, Source={StaticResource Locator}}">
<Grid>
<TextBlock Text="Loading!!"/>
</Grid>
</UserControl>
你知道它可能是什么吗? 提前致谢, 纪尧姆
在您的 UserControl
中,您明确设置了 DataContext
。
DataContext="{Binding Loading, Source={StaticResource Locator}}"
这意味着以下绑定将不起作用:
Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"
原因是因为绑定正在 UserControl 的 当前 DataContext 中寻找 Test2
。相反,您需要在 父控件的 DataContext.
Test2
试试这个:
Visibility="{Binding DataContext.Test2, RelativeSource={RelativeSource AncestorType=Page}, Converter={StaticResource BooleanToVisibilityConverter}}"
我认为你的问题是 DataContext
因为页面 DataContext 是
DataContext="{Binding Main, Source={StaticResource Locator}}"
当您将 usercontrol dataContext 设置为 DataContext="{Binding Loading, Source={StaticResource Locator}}"
尝试像这样更改您的代码
<Page x:Class="CitiBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="using:CitiBox.Converters"
xmlns:views="using:CitiBox.Views"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{Binding Main, Source={StaticResource Locator}}"
x:Name="Page">
<Page.Resources>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>
<Grid>
<!--<TextBlock Text="Test1" Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBlock Text="Test2" Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>-->
<views:LoadingView Visibility="{Binding ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<views:DrawerView Visibility="{Binding ElementName=Page,Path=DataContext.Test1, Converter={StaticResourceBooleanToVisibilityConverter}}"/>
</Grid>
</Page>
问题出在DataContext的使用上。您的 MainPage
有一个 DataContext :
DataContext="{Binding Main, Source={StaticResource Locator}}"
LoadingView 还有一个 DataContext
因此,当您编写这段代码时:
您尝试在 LoadingView 的 DataContext 中查找 Test2
作为字段,因为您在同一个视图中。为避免这种行为,您可以尝试这样做:
<views:LoadingView Visibility="{Binding ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
或者你可以写一个class调用NavigationService
继承自INavigationService
(MVVM Light)
您项目中的每个视图都是一个页面,您将成为所有页面之间的过渡(如淡入淡出)