上个我开发的界面截图:
方法一:直接修改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)