1

プログラムは正常に動作し、クラッシュなどは発生しません。しかし、データはテーブルに表示されていません(datagrid)

更新版:

ビュー: Userperspective.xaml

バインディングパス「Products」が不明なdatacontextであるため、xamlファイルでエラーが発生します

  <Grid Margin="0,0,0,-20">
        <DataGrid Name="Producttable" ItemsSource="{Binding Path=Products}"                 
                  HorizontalAlignment="Left" Height="200" Margin="10,44,0,0"  
                  VerticalAlignment="Top" Width="972"  />

ビュー: Userperspective.xaml.cs

public partial class Userperspective : Window
{
    public Userperspective()
    {
        InitializeComponent();
        DataContext = new ProductViewModel();
    }
}

ProductviewModel

      private readonly Product _product;
    private IBackend _backend;
    public ICommand ProductCommand { get; set; }
    public IList<Product> Products { get; set; }

    public ProductViewModel()
    {
        _backend = new BackendService();
        _product = new Product();
        ProductCommand = new ProductCommand(this);
    }

    public Product Product()
    {
        return _product;
    }

    public void LoadProducts()
    {
        Products = _backend.GetProducts();
        RaisePropertyChanged("Products");
    }

Productcommand

    private readonly ProductViewModel _vm;

    public ProductCommand(ProductViewModel vm)
    {
        this._vm = vm;
    }      

    public void Execute(object parameter)
    {
        _vm.LoadProducts();
    }

BackendService

namespace _blabla
{
    class BackendService : IBackend
    {
        public IList<Product> GetProducts()
        {
            using (var db = new NORTHWNDEntities())
            {
                var query = from p in db.Products
                            select new Product
                            {
                                Name = p.ProductName,
                            };

                return query.ToList();
            }
        }
    }
}

Ibackend

namespace _blabla.Commands
{
    public interface IBackend
    {
        IList<Product> GetProducts();    
    }
}
4

2 に答える 2

1

WPFとMVVMを初めて使用する場合は、問題をもう少し管理しやすいものに分解する必要があります。コードには多くのことが起こっています。MVVM、コマンド、データベースアクセス、およびいくつかの抽象化。あなたの意図は正しいですが、それはこの問題の解決を容易にするものではありません。

あなたが提供した情報では、問題が何であるかは100%もわかりませんが、それはバインディングまたはデータベースアクセスのいずれかであると思われます。私はあなたに拘束力のある側面を示すことに集中します。

私はあなたのデータベースコードにアクセスできないので、この問題を解決するのに役立ついくつかのクラスをモックアップしました。

注:コマンドコードはノイズであるため、回答から削除し、製品のリストへのバインドに集中します(これが機能したら、コマンドソリューションと統合できます)。

製品

public class Product
{
    public string Name { get; set; }
    public string Description { get; set; }

    public override string ToString()
    {
        return string.Format("Product: ({0}), {1}", Name, Description);
    }
}

BackendService:これは基本的に、データベースにアクセスできる代わりに一連の製品を返します。

class BackendService : IBackend
{
    public IList<Product> GetProducts()
    {
        return new Product[]
        {
            new Product{ Name = "Laptop", Description = "Dell 17inch laptop" },
            new Product{ Name = "Mobile Phone", Description = "iPhone" },
            new Product{ Name = "Television", Description = "Samsung 32 inch plasma" },
            new Product{ Name = "Car", Description = "Gran Torino" },
            new Product{ Name = "Book", Description = "Effective C#" },
        };
    }
}

Listboxアクセスできないため、viewModel内の製品のリストをにバインドしましたDataGridが、それ以外の場合はメインウィンドウのコードを変更していません。

Mainwindow.xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ListBox Margin="5"
             ItemsSource="{Binding Path=GetProducts}"/>
</Grid>

Mainwindow.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ProductViewModel();
    }
}

ここで、viewModelを使用すると、のインスタンスをインスタンス化していないためNullReferenceException、への呼び出しから発生するが取得されます。このようにコンストラクターを更新すると、次のようになります。_backend.GetProducts()BackendService

public ProductViewModel()
{
    _backend = new BackendService();
    _product = new Product();
    ProductCommand = new ProductCommand(this);
}

アプリケーションを実行すると、製品のリストが正しく表示されます。

ここに画像の説明を入力してください

私が提供したコードをプロジェクトに統合し、それが機能していることを実証できるはずです。これに満足したら、BackendService代わりにデータベースから製品のリストを呼び出すようにクラスを更新する必要があります。当然のことながら、これをすべてのバインディングに対して行うことをお勧めします。これにより、バインディングが機能していないのか、データベース呼び出しであるのかがわかります。

于 2012-12-20T20:22:58.273 に答える
0

実行しようとしていますがGetProducts、これはメソッドではなくプロパティです-製品をロードするための別のメソッドを作成し、プロパティ名をより意味のあるものに変更してください

public IList<Product> Products {get;set;}

次に、商品を読み込むメソッドを作成します

public void LoadProducts()
{
    Products = _backend.GetProducts();
    //You will need to notify of property change here
    OnPropertyChanged("Products");
}

Products次に、xamlでバインドします

    <Window x:Class="_blabla.View.Userperspective"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="UserPerspective" Height="500" Width="1000">

    <Grid Margin="0,0,0,-20">
        <DataGrid Name="Producttable" ItemsSource="{Binding Path=Products}"                 
                  HorizontalAlignment="Left" Height="200" Margin="10,44,0,0"  
                  VerticalAlignment="Top" Width="972"  />
    </Grid>
</Window>

次に、コマンド呼び出しでLoadProducts

public void Execute(object parameter)
{
    _vm.LoadProducts();
}

INotifyPropertyChangedを実装して、UIがProductsプロパティを変更したことを認識できるようにする必要があります

于 2012-12-20T16:16:38.990 に答える