1

私はWPF Windowsアプリケーションに取り組んでいます。ListBox を使用してコンテンツを表示/編集しています。その中で私は計算をしています。だから私はそれを再生成するために余分なボタンを追加することなく、1つのアイテムの値を変更すると自動的に計算が変更されることを望んでいます。

<ListBox ItemsSource="{Binding CustomSalesProducts, Mode=TwoWay}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
        <ItemsControl.Template>
            <ControlTemplate TargetType="ItemsControl">
                <Border>
                    <ScrollViewer VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ItemsControl.Template>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel CanHorizontallyScroll="True" CanVerticallyScroll="True" Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="SalesGrid" Background="White">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <controls:HeaderedContentControl Header="{Binding ProductName, Mode=TwoWay}" Margin="{DynamicResource Margin4}" Style="{DynamicResource HeaderedContentControlStyle}" HorizontalContentAlignment="Right">
                    </controls:HeaderedContentControl>
                    <TextBox Text="{Binding OrderQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Margin="{StaticResource Margin4}" Style="{DynamicResource MiniTextBoxStyle}" ToolTip="Quantity" />
                    <TextBlock Text="{Binding UnitSalePrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="1" Margin="{StaticResource Margin4}" ToolTip="Price"/>
                    <TextBox Text="{Binding Discount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="1" Margin="{StaticResource Margin4}" Style="{DynamicResource MiniTextBoxStyle}" ToolTip="Discount"/>
                    <TextBlock Text="{Binding TaxAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.Row="1" Margin="{StaticResource Margin4}" ToolTip="Tax Amount"/>
                    <TextBlock Text="{Binding LineTotal, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Grid.Row="1" Margin="{StaticResource Margin4}" ToolTip="Total"/>

                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ListBox>

編集:

トリガーを試しましたが、リストボックスで機能しません

お気に入り:

<TextBox Text="{Binding OrderQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="{StaticResource Margin4}" Style="{DynamicResource MiniTextBoxStyle}" ToolTip="Quantity" >
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="LostFocus">
                                    <i:InvokeCommandAction Command="{Binding RefreshProduct}"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </TextBox>

ありがとう

4

1 に答える 1

1

だからこれは私が提案するものです:

  • Model クラス (CustomSalesProduct など) が INotifyPropertyChanged インターフェイスを実装していることを確認してください。
  • OrderQty プロパティ値が変更された場合 (たとえば、ユーザーが TextBox に別の数量を入力した場合)、メソッドを呼び出して、プロパティ セットの合計を計算します。これにより、ビューの LineTotal 値が自動的に更新されます。

編集: MVVMデザインパターンを使用することにした場合:

次のような ViewModel クラスを作成します。

public class CustomSalesViewModel
{
   public ObservableCollection<CustomSalesProduct> CustomSalesProducts {get;set;}

   public CustomSalesViewModel()
  {
    //Initialize your collection in constructor
    CustomSalesProducts = new ObservableCollection<CustomSalesProduct>();
    //Populate list
    CustomSalesProducts.Add(new CustomSalesProduct(){....});
    //.... Add rest of items
  }
}

次に、View の DataContext を CustomSalesViewModel のインスタンスに設定します。次のように、ビュー (XAML) のコード ビハインドのコンストラクターでそれを行うことができます。

DataContext = new CustomSalesViewModel();

サンプルクラスは次のとおりです。

public class CustomSalesProduct : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private int _orderQty;

        public int OrderQty
        {
            get { return _orderQty; }
            set
            {
                _orderQty = value;
                OnPropertyChanged("OrderQty");
                CalcTotal();
            }
        }

        private double _unitSalePrice;

        public double UnitSalePrice
        {
            get { return _unitSalePrice; }
            set
            {
                _unitSalePrice = value;
                OnPropertyChanged("UnitSalePrice");
            }
        }

        private double _discount;

        public double Discount
        {
            get { return _discount; }
            set
            {
                _discount = value;
                OnPropertyChanged("Discount");
            }
        }

        private double _taxAmount;

        public double TaxAmount
        {
            get { return _taxAmount; }
            set
            {
                _taxAmount = value;
                OnPropertyChanged("TaxAmount");
            }
        }

        private double _lineTotal;

        public double LineTotal
        {
            get { return _lineTotal; }
            set
            {
                _lineTotal = value;
                OnPropertyChanged("LineTotal");
            }
        }

        private string _productName;

        public string ProductName
        {
            get { return _productName; }
            set
            {
                _productName = value;
                OnPropertyChanged("ProductName");
            }
        }

        public void CalcTotal()
        {
            LineTotal = OrderQty*UnitSalePrice*(1 - Discount);
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
于 2012-06-09T14:14:58.437 に答える