2011-12-02 72 views
0

我得到了一些麻烦与结合使用MVVM工具包,并会向likr一些knwo告知,如果我正确地做事情。首先,我有一个定义如下视图模型定位:数据绑定与MVVM光工具包

public class ViewModelLocator 
{ 
    private static MainViewModel _main; 
    private static ProductViewModel _product; 

    /// <summary> 
    /// Initializes a new instance of the ViewModelLocator class. 
    /// </summary> 
    public ViewModelLocator() 
    { 
     ////if (ViewModelBase.IsInDesignModeStatic) 
     ////{ 
     //// // Create design time view models 
     ////} 
     ////else 
     ////{ 
     //// // Create run time view models 
     ////} 

     CreateMain(); 
     CreateProduct(); 
    } 

    /// <summary> 
    /// Gets the Main property. 
    /// </summary> 
    public static MainViewModel MainStatic 
    { 
     get 
     { 
      if (_main == null) 
      { 
       CreateMain(); 
      } 

      return _main; 
     } 
    } 

    /// <summary> 
    /// Gets the Main property. 
    /// </summary> 
    public static ProductViewModel ProductStatic 
    { 
     get 
     { 
      if (_product == null) 
      { 
       CreateProduct(); 
      } 

      return _product; 
     } 
    } 

    /// <summary> 
    /// Gets the Main property. 
    /// </summary> 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
     "CA1822:MarkMembersAsStatic", 
     Justification = "This non-static member is needed for data binding purposes.")] 
    public MainViewModel Main 
    { 
     get 
     { 
      return MainStatic; 
     } 
    } 

    /// <summary> 
    /// Gets the Main property. 
    /// </summary> 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
     "CA1822:MarkMembersAsStatic", 
     Justification = "This non-static member is needed for data binding purposes.")] 
    public ProductViewModel Product 
    { 
     get 
     { 
      return ProductStatic; 
     } 
    } 

    /// <summary> 
    /// Provides a deterministic way to delete the Main property. 
    /// </summary> 
    public static void ClearMain() 
    { 
     _main.Cleanup(); 
     _main = null; 
    } 

    /// <summary> 
    /// Provides a deterministic way to create the Main property. 
    /// </summary> 
    public static void CreateMain() 
    { 
     if (_main == null) 
     { 
      _main = new MainViewModel(); 
     } 
    } 

    /// <summary> 
    /// Provides a deterministic way to create the Main property. 
    /// </summary> 
    public static void CreateProduct() 
    { 
     if (_product == null) 
     { 
      _product = new ProductViewModel(); 
     } 
    } 

    /// <summary> 
    /// Cleans up all the resources. 
    /// </summary> 
    public static void Cleanup() 
    { 
     ClearMain(); 
    } 
} 

然后,我有我的,我设置的DataContext作为主窗口: 的DataContext =“{绑定源= {X:静态虚拟机:ViewModelLocator.MainStatic}}”

在我的主窗口中我有一个列表框,这将有作为的ItemSource ProductViewModel的集合定义如下:

public class ProductViewModel : ViewModelBase 
{ 

    SvcProduct.ProductServiceClient _clientSvc =new SvcProduct.ProductServiceClient() ; 
    ObservableCollection<Product> _products = new ObservableCollection<Product>(); 


    public ObservableCollection<Product> Products 
    { 
     get { return _products; } 
     set { _products = value; } 
    } 

    /// <summary> 
    /// Initializes a new instance of the ProductViewModel class. 
    /// </summary> 
    public ProductViewModel() 
    { 
     ////if (IsInDesignMode) 
     ////{ 
     //// // Code runs in Blend --> create design time data. 
     ////} 
     ////else 
     ////{ 
     //// // Code runs "for real": Connect to service, etc... 
     ////} 
     _products=_clientSvc.GetProducts(); 

    } 

    ////public override void Cleanup() 
    ////{ 
    //// // Clean own resources if needed 

    //// base.Cleanup(); 
    ////} 
} 
在产品

ProductViewModel返回集合的列表框。在列表框中的每一项连接到的ProductView这是一个用户控件定义如下:

<UserControl 
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:vm="clr-namespace:Solatys.Presentation.ViewModel" 
mc:Ignorable="d" 
x:Class="Solatys.Presentation.ProductView" 
x:Name="UserControl" 
d:DesignWidth="640" d:DesignHeight="480" Width="433" Height="319" 
IsManipulationEnabled="True" 
DataContext="{Binding Source={x:Static vm:ViewModelLocator.ProductStatic}}"> 

<Grid x:Name="LayoutRoot"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="144.3"/> 
     <ColumnDefinition Width="0.64*"/> 
     <ColumnDefinition Width="144.3"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="35" MaxHeight="35"/> 
     <RowDefinition Height="130" MaxHeight="130"/> 
     <RowDefinition Height="130" MaxHeight="130"/> 
     <RowDefinition Height="24" MaxHeight="24"/> 
    </Grid.RowDefinitions> 
     <Image Source="Resources/beauté.jpg" Grid.Row="1" Stretch="UniformToFill" Grid.RowSpan="2" Grid.ColumnSpan="3"/> 
    <TextBlock TextWrapping="Wrap" Grid.Column="1" Text="{Binding ProductName}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" Foreground="White" FontFamily="Perpetua Titling MT" TextAlignment="Justify"/> 
     <Border BorderBrush="Black" BorderThickness="0" Grid.Row="3" Grid.ColumnSpan="3"> 
      <Border.Background> 
       <RadialGradientBrush> 
        <GradientStop Color="#00000000" Offset="1"/> 
        <GradientStop Color="#FF005E01"/> 
       </RadialGradientBrush> 
      </Border.Background> 
      <TextBlock TextWrapping="Wrap" Text="Coup de Coeur" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Perpetua" TextAlignment="Justify" FontSize="13.333"/> 
     </Border> 

     <Border Grid.Row="1" Grid.Column="0" Background="#7F000000" d:LayoutOverrides="Width"> 
      <TextBlock TextWrapping="Wrap" Foreground="White" FontFamily="Perpetua" Margin="5"><Run Text="Type de produit"/><Run Language="fr-fr" Text=" : "/><LineBreak/><Run Language="fr-fr"/><LineBreak/><Run Language="fr-fr" Text="Produit de beauté Bio"/></TextBlock> 
     </Border> 

     <Border HorizontalAlignment="Right" Grid.Row="1" Grid.Column="2" Width="144.3" Height="130" Background="#7F000000"> 
      <TextBlock Margin="5" TextWrapping="Wrap" Foreground="White" FontFamily="Perpetua"><Run Text="Court descriptif"/><LineBreak/><Run/><LineBreak/><Run Language="fr-fr" Text="Ce nouveau produit reste notre coup de coeur pour ses propriétés naturelles ..."/></TextBlock> 
     </Border> 

     <Border HorizontalAlignment="Center" Grid.Row="2" Grid.Column="1" Width="144.3" Height="130" Background="#7F000000"> 
      <TextBlock TextWrapping="Wrap" Margin="5" Foreground="White" FontFamily="Perpetua"><Run Text="Caractéristiques du produit"/><Run Language="fr-fr" Text=" : "/><LineBreak/><Run Language="fr-fr"/><LineBreak/><Run Language="fr-fr" Text="- rajeunissant"/><LineBreak/><Run Language="fr-fr" Text="- vivifiant"/><LineBreak/><Run Language="fr-fr" Text="- prix attractif"/><LineBreak/><Run Language="fr-fr" Text="- produit contrôlé"/></TextBlock> 
     </Border> 

</Grid> 

正如你可以看到在DataContext上面设置为ViewModelLocator.ProductStatic但它说,像一个错误由于它似乎绑定不工作作为我的列表框是我的主要窗口

1-任何想法,我做错了该错误空“无法创建ViewModelLocator的实例”

? 2。在我的情况,我应该怎么绑定的ItemSource作为集合是ProductViewModel的集合?

问候 哔叽

回答

1

“无法创建ViewModelLocator的实例”通常是一个迹象,表明出现了错误,而虚拟机创建。尝试在_products = _clientSvc.GetProducts()上放置断点,然后调试代码。我敢肯定的东西是在这个方法中脚麻抛出一个异常,这是造成ViewModelLocator失败了。

干杯, 洛朗

+0

我发现,这些问题来自调用WCF服务代理。如果我从VIew的创建中删除代理服务器电话,我没有这个错误。我应该如何处理这种情况,那么当我需要一个电话到服务,以获得我的产品的清单,并将其绑定到视图?任何提示,couls找不到示例 – serge

+0

如果仅在加载页面后调用WCF服务会发生什么情况?你在WCF服务中看到异常吗?您是否尝试调试该调用并查看它出了什么问题?在http://www.galasoft.ch/mvvmvideo2上查看我的Deep Dive MVVM的指导 – LBugnion