Silverlight MVVM实现不显示内容

时间:2014-06-25 18:32:59

标签: c# wpf silverlight xaml mvvm

编辑: 问题是我的视图模型不公开,因此找不到绑定。出于某种原因,他们需要在Silverlight中公开,即使私有视图模型适用于WPF。我在下面的回答中有更详细的说明。


我正在尝试在Silverlight中实现MVVM WPF应用程序,但我之前从未使用过Silverlight。我正在努力获得要显示的绑定内容。我几乎完全按照WPF的方式实现它,除了Main位是UserControl,而不是Window,应用程序由网站托管,我必须删除x:Type中的DataTemplate } DataType

我的网站到主页工作正常,因为我可以在该页面中显示文本框或其他内容,但是不会显示绑定。有什么建议吗?

我的MainPage.xaml.cs:

public partial class MainPage : UserControl
{
    private MainPageViewModel _viewModel;

    public MainPage()
    {
        InitializeComponent();

        _viewModel = new MainPageViewModel();
        this.DataContext = _viewModel;
    }
}

我的MainPage.xaml:

<UserControl x:Class="TransformationServices.Silverlight.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"
    mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"
    xmlns:view="clr-namespace:TransformationServices.Silverlight.View"
    xmlns:viewModel="clr-namespace:TransformationServices.Silverlight.ViewModel"
    xmlns:local="clr-namespace:TransformationServices.Silverlight"
    Background="#FF2D2D30">
    <UserControl.Resources>
    <local:ViewConverter x:Key="viewConverter"/>
        <DataTemplate DataType="viewModel:InputSelectViewModel">
            <TextBlock Text="Hello World!"/>
            <!-- This textblock is just for testing. It doesn't work, and neither does the following line-->
            <view:InputSelect/>
        </DataTemplate>
    </UserControl.Resources>
    <ContentControl Content="{Binding CurrentView}" />
</UserControl>

我的MainPageViewModel.cs

class MainPageViewModel : ViewModelBase, INotifyPropertyChanged
{ 
    private ViewModelBase _currentView;

    private List<ViewModelBase> _viewModels;

    private int _viewIndex;

    public ViewModelBase CurrentView
    {
        get { return _currentView; }
        set
        {
            if (value != _currentView)
            {
                _currentView = value;
                OnPropertyChanged("CurrentView");
            }
        }
    }

    public MainPageViewModel()
    {
        _viewModels = new List<ViewModelBase>();

        // Add view models here
        _viewModels.Add(new InputSelectViewModel());

        _viewIndex = 0;
        CurrentView = _viewModels[_viewIndex];
    }
}

1 个答案:

答案 0 :(得分:2)

问题似乎是我的ViewModel不公开。我在输出中注意到以下类型的消息:

System.Windows.Data Error: Cannot get '<Whatever property of View Model>' value ...

此消息是针对我绑定的每个属性,包括CurrentView。将View Models公开后,绑定工作完美。对我来说,Silverlight需要将这些类作为WPF的私有工作时才需要公开,这似乎很奇怪,但这是我第一次使用Silverlight,所以这种复杂性让我感到高兴。希望这个答案可以帮助将来的某个人。无论如何,这是绑定不起作用的主要原因,因此CurrentView没有显示。

我很难调试此问题的另一个原因是我的页面意外缓存了所有内容,因此我的某些更改无法显示。这个链接帮助了我:

http://www.codeproject.com/Articles/143414/Prevent-your-Silverlight-XAP-File-from-Caching-in