1

以下の XAML コードを記述したリストボックスとコンボボックスがあり、XAML ではなく IronPython コード内からこのリストボックスとコンボボックスにデータを入力しようとしています。

コード内からこのリストを作成するにはどうすればよいですか?

リストには複数の列が必要です。

<ComboBox
x:Name="comboBox1"
Grid.Column="0"
Grid.Row="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="53,14.223,0,0"
Width="54"
Height="19" />

<ListBox
x:Name="listBox1"
Grid.Column="0"
Grid.Row="0"
VerticalAlignment="Top"
Margin="0,30.223,14.5,0"
Height="368.639" HorizontalAlignment="Right" Width="442.619" />
4

1 に答える 1

1

次の SO 投稿から受け入れられた回答を使用: How do I bind to a ListBox in IronPython? Ironpython コードからコンボボックスとリストを設定してバインドすることができました。

誰かが同じ状況に陥った場合に備えて、すべてのコードをここに置きます。

最初に、リストボックスがバインディングを指定するために XAML を変更する必要があります。

<DataTemplate x:Key="DataTemplate1">
             <Grid>
                  <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="80"/>
                     <ColumnDefinition Width="*"/>
                  </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Path=lproperty, FallbackValue=Property}" />
            <TextBlock Text="{Binding Path=lvalue, FallbackValue=Value}" Grid.Column="1" HorizontalAlignment="Right" Margin="0,0,-60,0" Width="360" />                

            </Grid>     


</DataTemplate>

次に、リストボックスのコンテンツもこのテンプレートにバインドする必要があります。

<ListBox
                            x:Name="listBox1"
                            Grid.Column="0"
                            Grid.Row="0"
                            VerticalAlignment="Top"
                            Margin="0,30.223,14.5,0"
                            Height="368.639" HorizontalAlignment="Right" Width="442.619" 
                            ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate1}"/>

それほど大きくないので、コンボボックスとリストボックスを設定するコード全体もここに置きます。

import wpf
from System.Windows import Application
from Window1 import Window1
from System.Windows.Controls import(ComboBox, 
    ComboBoxItem, ListBox, ListBoxItem)
from System.Collections.ObjectModel import *
from System.ComponentModel import *
from System.Windows.Controls import *
import pyevent 





entries = {
1 : ('Email', 'test.user@gmail.com' ), 
2 : ('Address', 'new york'),
3 : ('Notes', 'this is a dummy form'), 
4 : ('Mobile Phone', '57234985734'),
5 : ('Work Fax', '5432578943'), 
6 : ('Work Phone', '32465765765') 
}

politetitles = {
1 : ('Mr' ), 
2 : ('Ms'),
3 : ('Mrs'), 
4 : ('Sir'),
}

class NotifyPropertyChangedBase(INotifyPropertyChanged):
    """INotifyProperty Helper"""
    PropertyChanged = None
    def __init__(self):
        (self.PropertyChanged, self._propertyChangedCaller) = pyevent.make_event()

    def add_PropertyChanged(self, value):
        if self.PropertyChanged is not None: 
            self.PropertyChanged += value

    def remove_PropertyChanged(self, value):
        if self.PropertyChanged is not None: 
            self.PropertyChanged -= value

    def OnPropertyChanged(self, propertyName):
            if self.PropertyChanged is not None: 
                self._propertyChangedCaller(self, PropertyChangedEventArgs(propertyName))


class myListEntry(NotifyPropertyChangedBase):

@property
def lvalue(self):
    return self._lvalue

@lvalue.setter
def lvalue(self, value):
    self._lvalue = value
    self.OnPropertyChanged("lvalue")

@property
def lproperty(self):
    return self._lproperty

@lproperty.setter
def lproperty(self, value):
    self._lproperty = value
    self.OnPropertyChanged("lproperty")


window = Window1()

#print window
app = Application()

combo = ComboBox()
titleitems = politetitles.items()
for key, data in titleitems:
    item = ComboBoxItem()
    item.Content = data
    item.FontSize = 8
    combo.Items.Add(item)
window.comboBox1.ItemsSource = combo.Items


listitems = entries.items()
listb = ObservableCollection[myListEntry]()
for key, data in listitems:
    item = ListBoxItem()
    lineitem = myListEntry()
    lineitem.lproperty=data[0]
    lineitem.lvalue=data[1]
    listb.Add(lineitem)
window.listBox1.ItemsSource = listb
print listb
app.Run(window)
于 2012-04-20T10:15:19.937 に答える