代码之家  ›  专栏  ›  技术社区  ›  Enriquev

对象上的WPF C数据绑定

  •  0
  • Enriquev  · 技术社区  · 15 年前

    假设我有这个控制权:

    public partial class bloc999 : UserControl
    {
     bloc999Data mainBlock = new bloc999Data();
    
     public bloc999()
     {
      InitializeComponent();
      mainBlock.txtContents = "100";
    
      base.DataContext = mainBlock;
     }
    }
    

    在XAML中:

        <TextBox Margin="74,116,106,0" Name="txtContents" 
    Text="{Binding Path=txtContents, UpdateSourceTrigger=PropertyChanged,Mode = TwoWay}" />
        <TextBox Margin="74,145,106,132" Name="txtContents2" 
    Text="{Binding Path=txtContents2, UpdateSourceTrigger=PropertyChanged,Mode = TwoWay}" />
    

    然后我上了这门课:

    public class bloc999Data : INotifyPropertyChanged
        {
         string _txtContents;
         string _txtContents2;
    
         public event PropertyChangedEventHandler PropertyChanged;
    
         void NotifyPropertyChanged(string propName)
         {
                if (this.PropertyChanged != null)
                    this.PropertyChanged(
                        this, new PropertyChangedEventArgs(propName));
         }
    
         public string txtContents2
         {
                get
                {
                  return this._txtContents2;
                }
                set
                {
                    if (int.Parse(value) > int.Parse(this._txtContents))
                    {
                        this._txtContents2 = "000";
                    }
                    else
                        this._txtContents2 = value;
    
                    NotifyPropertyChanged("txtContents2");
                }
            }
    
            public string txtContents 
            {
                get
                {
                    return this._txtContents;
                }
                set 
                {
                    this._txtContents = value;
                    NotifyPropertyChanged("txtContents");
                } 
            }
        }
    

    好的,现在假设我在表单上有一个按钮,我在代码中这样做:

    mainBlock.txtContents2 = "7777777";
    

    它在文本框中输入000,但如果我只是手工输入,在文本框(txtContents2)中,会调用setter代码,但由于某种原因,文本框值不会更改,实例值也不会更改。帮助?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Tim Cooper    13 年前

    我认为这仅仅是因为值在数据绑定操作的上下文中发生了变化,所以wpf忽略它是因为 它知道价值在变化 认为这件事是多余的。它是什么 知道的是,你已经走了,把值从wpf的值改成了其他值。

    如果您在单独的消息中进行通知,那么WPF将在当前数据绑定操作的上下文之外处理它,从而获取更改:

    if (int.Parse(value) > int.Parse(this._txtContents))
    {
        this._txtContents2 = "000";
    
        // notify WPF of our change to the property in a separate message
        Dispatcher.BeginInvoke((ThreadStart)delegate
        {
            NotifyPropertyChanged("txtContents2");
        });
    }
    else
    {
        this._txtContents2 = value;
        NotifyPropertyChanged("txtContents2");
    }
    

    这假定您的视图模型可以访问 Dispatcher . 如何执行此操作的示例如所示 my blog post 在一个基地 ViewModel 班级。

        2
  •  0
  •   Community CDub    8 年前

    我以前也有类似的问题 here

    在用户控件中,更新绑定并将UpdateSourceTrigger设置为Explicit

    <TextBox Margin="74,145,106,132" x:Name="txtContents2" TextChanged="txtContents2_TextChanged"
    

    text=“绑定路径=txtContents2,updateSourceTrigger=显式,模式=twoway”/>gt;

    然后,在TextChanged事件处理程序中,通过验证输入手动更新绑定。 将验证逻辑从此事件处理程序的bloc999data中的属性txtContent2的setter中移动

        private void txtContents2_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (int.Parse(txtContents2.Text) > int.Parse(mainBlock.txtContents))
            {
                mainBlock.txtContents2 = "000";
                txtContents2.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
            }
            else
            {
                mainBlock.txtContents2 = txtContents2.Text;
                txtContents2.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            }
        }
    

    它起作用了。

    希望它有帮助!!