IronPython+WPF 修改ListView 中的CheckBox和TextBox等控件的使得数据实时更新的办法

上个我开发的界面截图:


方法一:直接修改ListView里的控件

     这种方法的难点在与如何获取控件,因为对.NET不熟悉,所以我来说这是个很麻烦的事情,当然如果我熟悉.NET也许我就不会用IronPython了。

    附上一段代码:

# -*- coding: utf-8 -*-
import wpf
from System.Diagnostics import Debug
from System.Windows import Window,DependencyObject
from System.Windows.Media import VisualTreeHelper
from System.Windows.Controls  import ItemContainerGenerator
from System.Windows.Controls import TextBox


def GetControl(do):
     for i in range(0, VisualTreeHelper.GetChildrenCount(do), 1) :  #通过VisualTreeHelper递归获取需要的控件,这里我需要的是TextBox
         Child = VisualTreeHelper.GetChild(do, i);
         if isinstance(Child, TextBox ) :
            Child.Focus()
            Child.Select(Child.Text.Length, 0)
            Child.Text="111"
            Debug.WriteLine(str(Child)) (Child)
          GetConrtol(Child)   

selectDependencyObject=sender.ItemContainerGenerator.ContainerFromItem(sender.SelectedItem) #把SelectedItem转成DependencyObject对象

GetConrtol(selectDependencyObject)

这种办法试用范围广


第二种:自己实现INotifyPropertyChanged接口

      这种做法不能直接控制空间,但可以让UI实时响应数据的改变

   大概的实现办法如下(我直接从项目里拿出来的,代码不完整的):

# -*- coding: utf-8 -*-
import wpf
from System.Diagnostics import Debug
from System.Windows import Window
from System.Windows.Forms import View ,ListViewItem
from System.Windows.Input import Key
from System.Collections.ObjectModel import ObservableCollection
from common.pyevent import *
from System.ComponentModel import INotifyPropertyChanged,PropertyChangedEventArgs


class NotifyPropertyChangedBase(INotifyPropertyChanged):
    """
 
http://sdlsdk.codeplex.com/Thread/View.aspx?ThreadId=30322
 
    """
    PropertyChanged = None
    def __init__(self):
        (self.PropertyChanged, self._propertyChangedCaller) = make_event()
 
    def add_PropertyChanged(self, value):
     
        self.PropertyChanged += value
 
    def remove_PropertyChanged(self, value):
        self.PropertyChanged -= value
     
    def OnPropertyChanged(self, propertyName):
        self._propertyChangedCaller(self, PropertyChangedEventArgs(propertyName))

class ItemByColor(NotifyPropertyChangedBase):
        def __init__(self,color,size,pricetype,price,num,unit,code,itemids):
            (self.PropertyChanged, self._propertyChangedCaller) = make_event()
            self.Color=color
            self.Code=code
            self.Size=size
            self.PriceType=pricetype
            self.Price=price
            self.Num=num
            self.ItemIds=itemids

            self.Unit=int(unit)*(len(itemids))
            self._IsSelected=False
        @property
        def IsSelected(self):
            return self._IsSelected
 
        @IsSelected.setter
        def IsSelected(self, value):
            self._IsSelected = value
            self.OnPropertyChanged("IsSelected")

class ItemChose(Window):
    def __init__(self,itemjson,locationid,pricetype,unit=0):
        self.ItemJson=itemjson
        self.LocationId=locationid
        self.PriceType=pricetype
        self.data = ObservableCollection[ItemByColor]()
        self.Unit=unit
        
 
        self.Code=itemjson["Data"]["Code"]
        
        if itemjson["Data"]["Pic"] != "":
            self.Pic=itemjson["Data"]["Pic"]
        else:
            self.Pic="/static/img/no-image.png"
        self.LoadComponent()

        self.Item=self.getItem()
        self.listview.ItemsSource = self.data
        self.listview.Focus()
        self.ItemAdd()
        
    def LoadComponent(self):
        wpf.LoadComponent(self, 'gui/ItemChose.xaml')
 
    
        
    def ItemAdd(self):
               
         items=self.Item
         for i in items:
      
           ibc=ItemByColor(  \
                color=i,\
                size=str(items[i]["Size"]),\
                price=items[i]["Price"],\
                pricetype=items[i]["PriceType"],\
                num=items[i]["Num"],\
                unit=self.Unit,\
                code=self.Code,\
                itemids=items[i]["ItemIds"]  )
         
           #self.listview.Items.Add(ibc)
           self.data.Add(ibc)







转载于:https://my.oschina.net/sol/blog/268301

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值