2015-06-17 82 views
1

我正在開發windows phone項目。 有些東西我不太瞭解我的xaml。BooleanToVisibilityConverter適用於Textblock而不適用於UserControl

這就是:

<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> 

,你將有可能是什麼想法? 在此先感謝, 紀堯姆。

回答

1

問題是使用DataCont分機。你MainPage有一個DataContext:

DataContext="{Binding Main, Source={StaticResource Locator}}" 

LoadingView也有一個DataContext

所以,當你寫這樣的代碼:

你試圖找到Test2作爲LoadingView因爲DataContext的一個領域你在同一個視圖中。爲了避免這種情況,你可以嘗試這樣的:

<views:LoadingView Visibility="{Binding ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/> 

或者,您可以編寫一個名爲從INavigationService(MVVM光)繼承NavigationService 類項目中的每個視圖將是一個頁面,你將是一個過渡(如淡入淡出)

1

在您的UserControl中,您明確設置了DataContext

DataContext="{Binding Loading, Source={StaticResource Locator}}" 

這意味着下面的結合將不起作用:

Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}" 

的原因是因爲在用戶控件的當前的DataContext正在尋找Test2的結合。相反,您需要在父控件的DataContext中尋找Test2

試試這個:

Visibility="{Binding DataContext.Test2, RelativeSource={RelativeSource AncestorType=Page}, Converter={StaticResource BooleanToVisibilityConverter}}" 
+0

我收到一條錯誤消息,指出「成員」AncestorType「未被識別或無法訪問。」以及「無法解析DataContext ......」錯誤的任何線索? – bottus

-1

我覺得你的問題是DataContext,因爲頁面的DataContext是

DataContext="{Binding Main, Source={StaticResource Locator}}" 

凡爲您設置用戶控件的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> 
+0

如果我這樣做,我的Page的DataContext不再是MainViewModel,而是我根本不需要的LoadingViewModel。 – bottus

相關問題