将结果和appendText结果绑定到文本框.WPF中的总初学者.需要帮助

use*_*969 3 data-binding wpf textbox

WPF的初学者总是跟我一起.

我在构建一个概念验证应用程序之前继续使用它.我已经决定给它一个WPF.

这是场景:

我有:

  • 一个View = CustomerView(带有"购买产品"按钮的userControl)
  • 一个txtbox(附加所有发生的动作)
  • ViewModel = CustomerViewModel(与服务等对话..并获得结果
  • Model = Customer(实现了InotifyPropertyChanged属性的简单类)

鉴于我有一系列产品和我购买的每个产品,我需要在userControl中将tENDBox APPEND TEXT打印出所有发生的动作,textBox应该看起来像

Start buying .....
Product 1 Sold
Product 2 Sold
Fineshed....
Run Code Online (Sandbox Code Playgroud)

我的问题是,尽管我在每件商品售出后成功通知我似乎无法看到我如何绑定或制作"产品1已售出,产品2出现在文本框中".

在Windows窗体中,我将使用一个名为ProductStatus的属性的userControl,每当收到通知我将appendText添加到textBox.来自服务时"我把beginInvoke放在了获取threadCross操作的地方".这是我要调查的另一个问题

private ProductStatus _productStatus;
public ProductStatus Status
{
  get { return _productStatus; }
  set
  {
    _printStatus = value;                 
    BeginInvoke((MethodInvoker)(() => txtProductResult.AppendText(string.Format("Product Sold {0}", Environment.NewLine))));  
  }
}
Run Code Online (Sandbox Code Playgroud)

如何为myTextBox为我销售的每件商品附加文字?

=================添加了当前代码============================== =

    void LogChanged(object sender, NotifyCollectionChangedEventArgs e) 
        { 
            foreach(object item in e.NewItems) 
            { 
                txtProduct.AppendText(item.ToString()); 
            } 
        } 

         <TextBox Margin="12,41,12,59" Name="txtPrintResult" />
       <TextBox Text="{Binding TicketPrintLog, Mode=OneWay}" Margin="12,41,12,12" />


            ProductModel
            =============
             public string ProductLog{ get; set; }


            ProductViewModel
            ==================
            public string ProductLog
            {
                get { return _ProductModel.ProductLog; }
            }   
            internal void AppendToProductLogText(string text)
            {
                _ProductModel.ProductLog += text + Environment.NewLine;
                OnPropertyChanged("ProductLog");
            } 

            void ProductSoldNotificationReceived(object sender, notificationEventArgs e)
            {
                //THIS FIRES WHENEVER I PRODUCT IS SOLD.
                AppendToProductLogText(e.Message);
             }

            ProductView (userControl) XAML
            ================================
            <TextBox Margin="12,41,12,59" Name="txtResult" Text="{Binding ProductLog, Mode=OneWay}" />  

            IN CODE BEHIND I DO

              public void Action1()
              {
                txtResult.AppendText(_productViewModel.ProductLog);
              }
               public void SellProductAction()
              {
                txtResult.AppendText(_productViewModel.ProductLog);
              }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我还有这个问题

        txtResult.AppendText(_productViewModel.ProductLog); 
Run Code Online (Sandbox Code Playgroud)

在执行SellproductAction的时候也打败了数据绑定点我只收到有关最后一项的通知,它没有附加产品1销售,产品2销售等....

有任何想法吗

ito*_*son 6

首先,您仍然可以通过将新文本附加到现有文本来以Windows窗体的方式执行此操作:

txtProductResult = txtProductResult + Environment.NewLine + "Product sold";
Run Code Online (Sandbox Code Playgroud)

(如果从后台线程执行此操作,则需要使用txtProductResult.Dispatcher.BeginInvoke而不是txtProductResult.BeginInvoke.)

但是,在WPF中执行此操作的惯用方法是使用数据绑定.因此,您将在视图模型上创建ProductSalesLog属性,并将TextBox绑定到该属性.然后,每当您更新视图模型中的ProductSalesLog属性时,TextBox将自动更新.请注意,您的视图模型必须实现INotifyPropertyChanged,并且必须为ProductSalesLog属性引发PropertyChanged事件.从而:

public class CustomerViewModel : INotifyPropertyChanged
{
  private string _productSalesLog = String.Empty;
  public string ProductSalesLog
  {
    get { return _productSalesLog; }
  }

  internal void AppendSalesLogText(string text)
  {
    _productSalesLog += text + Environment.NewLine;
    OnPropertyChanged("ProductSalesLog");
  }
}
Run Code Online (Sandbox Code Playgroud)

在你看来:

<TextBox Text="{Binding ProductSalesLog, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)