我无法让 MVVM 工作

本文关键字:MVVM 工作 | 更新日期: 2023-09-27 17:57:05

我拼命地尝试实现MVVM,但由于某种原因它不起作用。我在 Windows 8.1 应用商店应用程序上使用 MVVM 灯。

我做错了什么?我现在遵循了三个教程,似乎没有任何效果。.

我从 Web 服务中检索数据,这部分 100% 工作得很好。可观察集合包含数据。

我的其余代码如下所示:

视图模型定位器:

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    if (ViewModelBase.IsInDesignModeStatic)
    {
        // Create design time view services and models
        SimpleIoc.Default.Register<IDesignTimeWeatherServiceLayer, DesignTimeWeatherServiceLayer>();
    }
    else
    {
        // Create run time view services and models
        SimpleIoc.Default.Register<IWeatherServiceLayer, WeatherServiceLayer>();
    }
    SimpleIoc.Default.Register<WeatherViewModel>();
}

public WeatherViewModel Weather
{
    get
    {
        return ServiceLocator.Current.GetInstance<WeatherViewModel>();
    }
}

视图模型:

public class WeatherViewModel : ViewModelBase
{
    WeatherServiceLayer serviceLayer = new WeatherServiceLayer();
    public async void GetAllWeatherData()
    {
        WeatherData = await serviceLayer.GetAllWeatherAsync();
    }
    private ObservableCollection<Weather> weatherData;
    public ObservableCollection<Weather> WeatherData { get { return weatherData; } set { weatherData = value; RaisePropertyChanged("WeatherData"); } }
}

代码隐藏:

public MainPage()
{
    this.InitializeComponent();
    WeatherViewModel vm = new WeatherViewModel();
    vm.GetAllWeatherData();
}

视图:

...
DataContext="{Binding Weather, Source={StaticResource Locator}}">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <GridView ItemTemplate="{StaticResource WeatherItemTemplate}" ItemsSource="{Binding Weather.WeatherData, Source={StaticResource Locator}}"/>
</Grid>

数据模板:

<DataTemplate x:Key="WeatherItemTemplate">
    <StackPanel>
        <TextBlock Text="{Binding Temperature}" Height="60" Margin="15,0,15,0"/>
        <TextBlock Text="{Binding WeekDay}" Margin="15,0,15,10"/>
    </StackPanel>
</DataTemplate>

我无法让 MVVM 工作

我不确定,但有几件事对我来说似乎很可疑。 最初,您设置数据上下文属性。 你确定你的数据上下文是你在这个任务之后所期望的吗? 调用 InitializeComponent 进行检查后,可以在视图的构造函数中设置断点。

此外,在您的 ItemsSource 绑定中,您说的是"Weather.WeatherData"来源于您的定位器。 这似乎是多余的,也许是错误的。 也许只是尝试"天气数据"并删除源规范。 如果你的 DataContext 是一个天气,那么它将是用于该 xaml 文件中的所有绑定的对象。