簡體   English   中英

Windows Phone 8.1 MVVM設置視圖的視圖模型

[英]Windows Phone 8.1 MVVM Setting ViewModel of View

MainPage.xaml中

<phone:PhoneApplicationPage
    x:Class="MyApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    SupportedOrientations="Portrait"  Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:viewModels="clr-namespace:MyApp.ViewModels"
    xmlns:views="clr-namespace:MyApp.Views"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance Type=viewModels:MainViewModel}">

    <!--FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"-->

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">



        <!--Pivot Control-->
        <phone:Pivot Title="MyApp">
            <!--Pivot item one-->
            <phone:PivotItem Header="Main">
                <Grid>

                </Grid>
            </phone:PivotItem>

            <!--Pivot item two-->
            <phone:PivotItem Header="Counter">
               <views:CounterView />
            </phone:PivotItem>
        </phone:Pivot>
    </Grid>

</phone:PhoneApplicationPage> 

CounterView.XAML

 <UserControl x:Class="MyApp.Views.CounterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewModels="clr-namespace:MyApp.ViewModels"
        mc:Ignorable="d"
        d:DesignHeight="480" d:DesignWidth="480"          
        d:DataContext="{d:DesignInstance Type=viewModels:CounterViewModel}">


        <Grid x:Name="LayoutRoot" Background="Blue" >
            <TextBlock Text="{Binding LightSensorInfo}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="75,137,0,316"/>
        </Grid>
    </UserControl>

錯誤:

System.Windows.Data Error: BindingExpression path error: 'LightSensorInfo' property not found on 'MyApp.ViewModels.MainViewModel' 'MyApp.ViewModels.MainViewModel' (HashCode=62333418). BindingExpression: Path='LightSensorInfo' DataItem='MyApp.ViewModels.MainViewModel' (HashCode=62333418); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..

憑啥應用程序試圖尋找到MainViewModel代替CounterViewModel我有一個CounterView,DataContext的內設置?

在WPF中,我也曾經設置ResourceDictionary:

<DataTemplate DataType="viewModels:CounterViewModel">
    <views:CounterView/>
</DataTemplate>

但是似乎WindowsPhone找不到DataType屬性,因此我注釋掉了這一部分。

我想念的是什么? 有任何想法嗎?

Hoooah! 找到解決方案!

CounterView.XAML

錯誤:

d:DataContext="{d:DesignInstance Type=viewModels:CounterViewModel}"

正確:

<UserControl.DataContext>
    <viewModels:CounterViewModel/>
</UserControl.DataContext>

最后:

<UserControl x:Class="MyApp.Views.CounterView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:viewModels="clr-namespace:MyApp.ViewModels"
    mc:Ignorable="d"
    d:DesignHeight="480" d:DesignWidth="480">

    <UserControl.DataContext>
        <viewModels:CounterViewModel/>
    </UserControl.DataContext>


    <Grid x:Name="LayoutRoot" Background="Blue" >
        <TextBlock Text="{Binding LightSensorInfo}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="75,137,0,316"/>
    </Grid>
</UserControl>

奇跡般有效! 這是我所做的唯一更改-無需執行其他任何操作。

http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html

答案似乎在該博客中。 尚未測試,但這聽起來合乎邏輯:

請注意:用戶控件的數據上下文屬性是從父級繼承的。 一個DataTemplate可能會這樣。 但是用戶控件無法預期數據上下文類型。 相反,他們希望顯式設置屬性。 我們想綁定這些屬性。

隨時更新我。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM