双向绑定模式问题求教

gaosam 2013-07-20 09:12:09
新手求教双向绑定的方式问题,不知道大虾们的使用思路是怎么样的
目前做的双向绑定思路一直是
/////////////////////////////////////////////////
后台创建一个public实体 然后给前台的Grid赋值
grid.DataContext = sbelistInfo;
然后Grid里的textbox双向绑定,点击保存的时候再拿sbelistInfo进行数据库commit的样子
当然textbox可以响应textchange事件把sbelistInfo的另一列的值更动,实现另一个控件的值直接变动的效果
这样做似乎有问题,但不影响效果
//////////////////////////////////////////////////
但这种思路用在datagrid上就出现问题了,比如datagrid列了个模板列
后台绑定了一个List<T> 数据源
我想实现对前几列的值改动后,自动算出合计列的值
<DataGridTemplateColumn Header="收费时间"  Width="120"  >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<DatePicker Text="{Binding FFetchDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Background="Transparent" Width="115" SelectedDateChanged="DatePicker_SelectedDateChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="A费用" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<MyContrl:MyTextBox Text="{Binding lcPrice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="MyTextBox_TextChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="B费用" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<MyContrl:MyTextBox Text="{Binding czPrice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="MyTextBox_TextChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="C费用" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<MyContrl:MyTextBox Text="{Binding zxPrice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="MyTextBox_TextChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="杂费" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<MyContrl:MyTextBox Text="{Binding qtPrice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="MyTextBox_TextChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="合计" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding FAmount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>


当我给前面几列的控件加上textchange事件时,绑定会重复触发,如果后台先=null再重新赋值,就会出现死循环,但如果不加textchange事件,又没办法对后台的list的合计列进行计算,
比如前面的时间控件,我想实现如果改变了时间,则添加一行新的,如果把时间删除,刚把这一行删掉
  private void DatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
if ((sender as DatePicker).Text == "")
{
t_CRM_ICStockBillEntryInfo selectItem = gdvDataList.SelectedItem as t_CRM_ICStockBillEntryInfo;
sbelist.Remove(selectItem);
}
else
{
t_CRM_ICStockBillEntryInfo sbe = sbelist.Where(q => q.FFetchDate == (sender as DatePicker).Text).FirstOrDefault();
if (sbe == null)
{
sbelist.Add(new t_CRM_ICStockBillEntryInfo { FFetchDate = (sender as DatePicker).Text, lcPrice = "0", czPrice = "0", zxPrice = "0", qtPrice = "0", FAmount = "0" });

}
}
gdvDataList.DataContext = null;//出现死循环
gdvDataList.DataContext = sbelist; //仅这样绑定 或者ItemSource也是,新添加进来的行不会显示出来
}


有没事件可以在后台list发生变动时响应的办法,或者有其它思路实现这些操作
...全文
413 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
haixinl2012 2013-08-20
  • 打赏
  • 举报
回复
二楼正解。。。。。
浪花三朵朵 2013-08-05
  • 打赏
  • 举报
回复
但对于最后一行统计行的操作却没办法实现~ 既然属性C可以可以自动计算出,为什么最后一行统计行的操作却没有办法实现呢,难点是?
ccitzs 2013-08-01
  • 打赏
  • 举报
回复
还有 记得绑定时{Binding XXX,Mode=TwoWay}
ccitzs 2013-08-01
  • 打赏
  • 举报
回复
怎么没法操作 你在A和B的set中调用PropertyChangedName不就完了
gaosam 2013-07-26
  • 打赏
  • 举报
回复
引用 9 楼 gaosam 的回复:
   public class testTowWay : INotifyPropertyChanged
        {
            private Decimal _a = 0;
            public Decimal A
            {
                get { return _a; }
                set { _a = value; CountC(); }
            }

            private Decimal _b = 0;
            public Decimal B
            {
                get { return _b; }
                set { _b = value; CountC(); }
            }

            private Decimal _c = 0;
            public Decimal C
            {
                get { return _c; }
                set { _c = value; PropertyChangedName("C"); }
            }

            public event PropertyChangedEventHandler PropertyChanged;
            public void PropertyChangedName(String PropertyName)
            {
                if (PropertyChanged != null)//有改变  
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));//对Name进行监听  
                }
            }

            public void CountC()
            {
                if (PropertyChanged != null)//有改变  
                { 
                    this.C = this.A + this.B;
                }
            }
        }
尝试下在类里写,但合计行的统计没办法实现,重点是发现,当数据绑定的时候,即使原来是值是7,现在的值仍然是7 都会响应,看来是只要值替换,即使替换的值不变,INotifyPropertyChanged仍然判断是值改变?
好吧~绑定时没有响应,可能搞错了,但这思路只能到这?因为触发响应后只能对当前行改动,虽然这样可以不写前端的textchange事件,但对于最后一行统计行的操作却没办法实现~
gaosam 2013-07-26
  • 打赏
  • 举报
回复
   public class testTowWay : INotifyPropertyChanged
        {
            private Decimal _a = 0;
            public Decimal A
            {
                get { return _a; }
                set { _a = value; CountC(); }
            }

            private Decimal _b = 0;
            public Decimal B
            {
                get { return _b; }
                set { _b = value; CountC(); }
            }

            private Decimal _c = 0;
            public Decimal C
            {
                get { return _c; }
                set { _c = value; PropertyChangedName("C"); }
            }

            public event PropertyChangedEventHandler PropertyChanged;
            public void PropertyChangedName(String PropertyName)
            {
                if (PropertyChanged != null)//有改变  
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));//对Name进行监听  
                }
            }

            public void CountC()
            {
                if (PropertyChanged != null)//有改变  
                { 
                    this.C = this.A + this.B;
                }
            }
        }
尝试下在类里写,但合计行的统计没办法实现,重点是发现,当数据绑定的时候,即使原来是值是7,现在的值仍然是7 都会响应,看来是只要值替换,即使替换的值不变,INotifyPropertyChanged仍然判断是值改变?
gaosam 2013-07-26
  • 打赏
  • 举报
回复
引用 7 楼 ccitzs 的回复:
用ObservableCollection<>作为数据源 不要用List<>可以解决你的问题
ObservableCollection没用过 试了下确实效果比List好,以后多用用试试,不过上面的问题还是存在 感觉 gdvDataList.ItemsSource = new ObservableCollection<MoneyTotle>(); 等同于 gdvDataList.ItemsSource = null; gdvDataList.ItemsSource = List<MoneyTotle>(); 个人感觉上面的问题主要原因是 gdvDataList.ItemsSource =List绑定的时候,触发了模版中的textchange事件 而textchange事件当中会有给数据源添加行并再次绑定的操作,于是进入了死循环 能想到跳出死循环的办法,要么是绑定数据源的时候想办法不触发textchange事件,但这个没思路 要么就是textchange事件中对数据源操作后不进行绑定操作,比如添加行后自动更新显示出来,而不需要再次执行gdvDataList.ItemsSource = new ObservableCollection<MoneyTotle>();这样的句子 试了下目前用List<>和ObservableCollection<>都需要给ItemsSource重新绑定,区别只在于需不需要在绑定前给个null值(ObservableCollection不用给null),但无法跳过绑定的步骤~
ccitzs 2013-07-25
  • 打赏
  • 举报
回复
用ObservableCollection<>作为数据源 不要用List<>可以解决你的问题
gaosam 2013-07-24
  • 打赏
  • 举报
回复
双向绑定对于模版中的控件和后台数据源对应的字段来说是实现了的 比如数据源I行I列的值改变,前台控件上的值也实现了改变 但如果添加一新行,前台控件并没有显示出来 而且绑定数据源的时候触发模版中控件的事件也是个问题,加载的时候容易重复操作。。。
gaosam 2013-07-24
  • 打赏
  • 举报
回复
public class t_CRM_ICStockBillEntry : ICloneable, INotifyPropertyChanged { private Int32 _id = -1; public Int32 ID { get { return _id; } set { _id = value; if (PropertyChanged != null)//有改变 { PropertyChanged(this, new PropertyChangedEventArgs("ID"));//对Name进行监听 } } } public event PropertyChangedEventHandler PropertyChanged; } 有实现了的
osnot 2013-07-23
  • 打赏
  • 举报
回复
二楼的方式可以实现
ccitzs 2013-07-22
  • 打赏
  • 举报
回复
数据源继承INotifyPropertyChanged接口并实现onPropertyChanged事件,在属性set时调用onPropertyChanged事件通知前台
ccitzs 2013-07-22
  • 打赏
  • 举报
回复
public class datasource : INotifyPropertyChanged
    {
        public bool ischeck=false;
        public bool isCheck
        {
            get
            {
                return ischeck;
            }
            set
            {
                ischeck = value;
                onPropertyChanged(this, "isCheck");
            }
        }
        public string col1 { get; set; }
        public string col2 { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        private void onPropertyChanged(object sender, string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
            }
        }

    }
husar516 2013-07-22
  • 打赏
  • 举报
回复
二楼正解……

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧