0

プロジェクトを現在の不安定な性質からより効率的な MVVM モデルに変換し始めました。これを行うと、ビュー領域で作成された ListBoxes がレンダリングされなくなります。コードのビルドと実行はスムーズですが、リスト ボックス コントロールは空のままです。これは、別のクラスからメソッド fillList を呼び出すと発生します。

public void FillList(List<StockItem> sList)
{
    List<StockItem> locallist = new List<StockItem>();

    locallist.Add(new StockItem { AvailableStock = " ijeifji", BlockedStock = "ijji", DetailedInfo = "rrkorkork", IDCode = "rokro", TotalStock = " iijerijer", UOM = "o", WarehouseName = "blargh" });
    locallist.Add(new StockItem { AvailableStock = " ijeifji", BlockedStock = "ijji", DetailedInfo = "rrkorkork", IDCode = "rokro", TotalStock = " iijerijer", UOM = "o", WarehouseName = "blargh" });
    locallist.Add(new StockItem { AvailableStock = " ijeifji", BlockedStock = "ijji", DetailedInfo = "rrkorkork", IDCode = "rokro", TotalStock = " iijerijer", UOM = "o", WarehouseName = "blargh" });

    listBox.ItemsSource = locallist;
   // listBox.ItemsSource = siList;
}

ここでは、接続をオフラインでテストするために locallist という TEMPORAL リストを作成しました。メソッドに送信されるリスト sList は、同じバインディング名を持つアイテムを含む同様のリストです。

私のリストボックスのXAMLは次のとおりです。

<ListBox x:Name="listBox" FontSize="26" SelectionChanged="listBox_SelectionChanged" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Height="176" Width="444" Background="#00292828">
                <Grid Height="159" VerticalAlignment="Top" Background="#6C5A5A5A">
                    <TextBlock Text="{Binding IDCode}" Height="28" Margin="8,7,164,0" VerticalAlignment="Top" Foreground="White" FontFamily="Segoe WP Light" FontSize="17.333"/>
                    <TextBlock Text="{Binding DetailedInfo}" Margin="8,39,164,0" Height="28" VerticalAlignment="Top" FontFamily="Segoe WP Light" FontSize="17.333"/>
                    <TextBlock Margin="24,73,15,0" TextWrapping="Wrap" FontFamily="Segoe WP Black" Height="29" VerticalAlignment="Top"><Run Text="TOTAL  "/><Run Text=" AVAILABLE  "/><Run Text=" BLOCKED"/></TextBlock>
                    <TextBox HorizontalAlignment="Left" Margin="8,0,0,-4" Text="{Binding TotalStock}" VerticalAlignment="Bottom" Height="61" Width="97" FontSize="18.667" Style="{StaticResource TextBoxStyle1}" Foreground="White" FontFamily="Segoe WP SemiLight" TextAlignment="Center"/>
                    <TextBox Margin="144,0,0,-4" Text="{Binding AvailableStock}" VerticalAlignment="Bottom" Height="61" FontSize="18.667" Style="{StaticResource TextBoxStyle1}" Foreground="White" FontFamily="Segoe WP SemiLight" TextAlignment="Center" HorizontalAlignment="Left" Width="102"/>
                    <TextBox HorizontalAlignment="Right" Margin="0,0,40,-4" Text="{Binding BlockedStock}" VerticalAlignment="Bottom" Height="61" Width="108" FontSize="18.667" Style="{StaticResource TextBoxStyle1}" Foreground="White" FontFamily="Segoe WP SemiLight" TextAlignment="Center"/>
                    <TextBlock HorizontalAlignment="Left" Margin="111,0,0,6.733" TextWrapping="Wrap" Text="{Binding UOM}" VerticalAlignment="Bottom" FontFamily="Segoe WP Light" FontSize="13.333"/>
                    <TextBlock HorizontalAlignment="Right" Margin="0,0,172.343,6.733" TextWrapping="Wrap" Text="{Binding UOM}" VerticalAlignment="Bottom" FontFamily="Segoe WP Light" FontSize="13.333"/>
                    <TextBlock HorizontalAlignment="Right" Margin="0,0,15.343,6.733" TextWrapping="Wrap" Text="{Binding UOM}" VerticalAlignment="Bottom" FontFamily="Segoe WP Light" FontSize="13.333"/>
                </Grid>
                <Button Content="Details" HorizontalAlignment="Right" VerticalAlignment="Top" Height="73" Width="146" Style="{StaticResource ButtonStyle1}" Foreground="#FFAAC028"/>
                <Rectangle Fill="White" Margin="0,-0.167,150.589,0" StrokeThickness="3" StrokeLineJoin="Round" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" d:LayoutRounding="Auto" HorizontalAlignment="Right" Height="57.75" VerticalAlignment="Top" Width="6.906">
                    <Rectangle.RenderTransform>
                        <CompositeTransform SkewX="21.737" TranslateX="19.935"/>
                    </Rectangle.RenderTransform>
                </Rectangle>
                <!--<Button Click="Button_Click"/>-->
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

問題は、ViewModel.cs から FillList メソッド (StockItemOverview.xaml.cs にあります) を呼び出したときに発生します (ここでは、リストが作成され、FillList(List sList) に送信されます)。プログラムが FillList メソッドを終了するとすぐに、実行を続けますが、リストボックスが表示されません!助けてください!

私のViewModel.csからの編集コード

public void PopulateListbox(List<StockItem> sentSI, int MAX)
{
    List<StockItem> stockItemList = new List<StockItem>();

    for (int i = 0; i < MAX; i++)
    {
        stockItemList.Add(new StockItem() { IDCode = sentSI[i].IDCode, DetailedInfo = sentSI[i].DetailedInfo, AvailableStock = sentSI[i].AvailableStock, BlockedStock = sentSI[i].BlockedStock, TotalStock = sentSI[i].TotalStock, UOM = sentSI[i].UOM });
        //stockItemList.Add(new StockItem() { IDCode = "Hubla", DetailedInfo = "17 C", AvailableStock = "20", BlockedStock = "10", TotalStock = "30" });
    }

    StockItemOverview pageDisplayer = new StockItemOverview();

    pageDisplayer.FillList(stockItemList);
}

および StockItem クラス:

public class StockItem
{
    public string IDCode { get; set; }
    public string AvailableStock { get; set; }
    public string BlockedStock { get; set; }
    public string TotalStock { get; set; }
    public string DetailedInfo { get; set; }
    public string WarehouseName { get; set; }
    public string UOM { get; set; }
}
4

2 に答える 2

0

いくつかの考え。

  1. BaseModelクラスを作成します。
  2. a。INotifyPropertyChangedを実装します(適切な名前空間を使用します)。b。メソッドを実装します。

例:

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string name)
{
   PropertyChangedEventHandler handler = PropertyChanged;
   if (handler != null)
      {
          handler(this, new PropertyChangedEventArgs(name));
      }
}
  1. すべてのModelクラス(たとえば、StockItem)はBaseModelクラスから継承します。

  2. StockItemクラスのすべてのフィールドのgetとsetをスペルアウトします。そして、Setメソッドで、対応するパブリックプロパティ名をパラメーターとして指定して、PropertyChangedメソッドを呼び出します。

例:

private string _idCode;

public string IDCode
{
 get{
      return _idCode;
    }
 set{
     _idCode = value;
     PropertyChanged("IDCode");
    }
}
  1. すべてのリスト<>をObservableCollection<>に変換します

  2. ViewModelにINotifyPropertyChangedインターフェイスを実装させるか、BaseViewModelから継承します(インターフェイスを実装する上記のBaseModelのように)。コレクションもプロパティとして定義します。Modelクラスの場合と同じように、PropertyChangedメソッドを呼び出します。

  3. listBox.ItemsSource=locallist;があります。Loadイベントまたはコンストラクターのステートメント。

  4. DataContextプロパティをViewModelに設定します。

于 2012-04-24T14:06:21.833 に答える
0

したがって、別の日にコードをいじった後、ViewModel の 2 つのインスタンスを作成し、お互いの StockList を呼び出していることに気付きました... ViewModel の同じインスタンスを正しく使用することで、リストボックスが正しく描画されるようになりました。 StockItem クラスから:

public class StockItem
{
        // Insert code required on object creation below this point.
        //      public string IDCode { get; set; }
        //      public string AvailableStock { get; set; }
        //      public string BlockedStock { get; set; }
        //      public string TotalStock { get; set; }
        //      public string DetailedInfo { get; set; }
        //      public string WarehouseName { get; set; }
        //      public string UOM { get; set; }

        //public StockItem() { }

        // public StockItem(string idcode, string avstock, string blstock, string totstock, string detinfo, string warehouse, string uom) 
        //  {
        //         this.IDCode = idcode;
        //         this.AvailableStock = avstock;
        //         this.BlockedStock = blstock;
        //         this.TotalStock = totstock;
        //         this.DetailedInfo = detinfo;
        //         this.WarehouseName = warehouse;
        //         this.UOM = uom;

        //     }
    private string _idcode;

    public string IDCode
    {
        get
        {
            return _idcode;
        }
        set
        {
            if (value != _idcode)
            {
                _idcode = value;
                NotifyPropertyChanged("IDCode");
            }
        }
    }
    private string _avstock;

    public string AvailableStock
    {
        get
        {
            return _avstock;
        }
        set
        {
            if (value != _avstock)
            {
                _avstock = value;
                NotifyPropertyChanged("AvailableStock");
            }
        }
    }
    private string _blstock;

    public string BlockedStock
    {
        get
        {
            return _blstock;
        }
        set
        {
            if (value != _blstock)
            {
                _blstock = value;
                NotifyPropertyChanged("BlockedStock");
            }
        }
    }
    private string _totstock;

    public string TotalStock
    {
        get
        {
            return _totstock;
        }
        set
        {
            if (value != _totstock)
            {
                _totstock = value;
                NotifyPropertyChanged("TotalStock");
            }
        }
    }
    private string _detinf;

    public string DetailedInfo
    {
        get
        {
            return _detinf;
        }
        set
        {
            if (value != _detinf)
            {
                _detinf = value;
                NotifyPropertyChanged("DetailedInfo");
            }
        }
    }
    private string _uom;

    public string UOM
    {
        get
        {
            return _uom;
        }
        set
        {
            if (value != _uom)
            {
                _uom = value;
                NotifyPropertyChanged("UOM");
            }
        }
    }
    private string _wareh;

    public string WarehouseName
    {
        get
        {
            return _wareh;
        }
        set
        {
            if (value != _wareh)
            {
                _wareh = value;
                NotifyPropertyChanged("WarehouseName");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

ItemsSource のバインディングを正しいビューモデルに追加します

private void StockItemOverview_Loaded(object sender, RoutedEventArgs e)
    {
        this.listBox.ItemsSource = App.ViewModel.StockItemList;

        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();
        }
    }
于 2012-04-25T11:01:34.907 に答える