Привязать ListBox.SelectedItem к свойству одного объекта и ItemsSource к другому объекту List (разные уровни!) - PullRequest
0 голосов
/ 21 января 2011

У меня довольно простой вопрос относительно WPF. Я искал вокруг, но пока не нашел "Ответ" ...

Я бы хотел сделать двухуровневую привязку данных. Упрощенно, у меня есть Персона с некоторыми атрибутами, которая также имеет N Адресов, каждый из которых имеет некоторый тип и с некоторым Почтовым индексом (оба выбираются из комбо).

Я получаю следующие данные с сервера:

public List<AddressType> AddressTypeList; // catalogue of Address Types
public List<ZipCode> ZipCodeList; // catalogue of Zip Codes

public Person Person; // Person object
public List<Address> PersonAddressList; // Address List for that person (each has AddresType and ZipCode property)

Теперь я хотел бы связать эти данные с некоторыми элементами управления. Итак, я поместил эти свойства в некоторый пользовательский класс (скажем, Data) и установил свойство DataContext основного пользовательского элемента управления для этого объекта:

data = new Data();            

data.AddressTypeList = dao.GetAll<AddressType>();
data.ZipCodeList = dao.GetAll<ZipCode>();
data.Person = dao.GetPerson();
data.PersonAddressList = dao.GetPersonAddressList(Person);

this.DataContext = data; // this == some parent UserControl

Теперь моя часть XAML для списка адресов выглядит примерно так:

<ListBox Name="listBoxAddressList" ItemsSource="{Binding PersonAddressList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <ComboBox ItemsSource="{Binding AddressTypeList}" SelectedItem="{Binding AddressType}"/>  
                <TextBox Text="{Binding Address}"/> <!-- this works! -->
                <ComboBox ItemsSource="{Binding ZipCodeList}" SelectedItem="{Binding ZipCode}"/>  
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Свойство Address связывается нормально, а вот AddressTypeList и ZipCodeList нет. Это логично, поскольку PersonAddress (в PersonAddressList) не имеет этого свойства (они находятся на другом уровне!). Я не хочу помещать весь список AddressTypes и ZipCodes в каждый адресный объект, я хотел бы наиболее безболезненно связать его с «родителем» или передать его каждому объекту списка адресов как-то в XAML.

Я думаю, что это обычный запрос иметь каталог некоторых значений в комбо (один список), но одно из них выбрано, и это значение привязано к свойству другого объекта. Как это будет сделано правильно?

1 Ответ

2 голосов
/ 21 января 2011

Редактировать 2: Вы также можете попытаться настроить свои списки как статические свойства, таким образом, вы можете связать напрямую, используя что-то вроде:

ItemsSource="{Binding Source={x:Static local:Data.AddressTypeList}}"

Редактировать: Попробуйте использовать RelativeSource, чтобы вернуться к исходным данным, что-то вроде этого:

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=DataContext.AddressTypeList}" SelectedValue="{Binding AddressType}"/>

Также: Привязать SelectedValue к свойству вместо SelectedItem.

например

<ItemsControl ItemsSource="{Binding Data}" Grid.IsSharedSizeScope="True">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="A"/>
                    <ColumnDefinition SharedSizeGroup="B"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Name}"/>
                <ComboBox Grid.Column="1" SelectedValue="{Binding Occupation}">
                    <sys:String>Programmer</sys:String>
                    <sys:String>GUI Designer</sys:String>
                    <sys:String>Coffee Getter</sys:String>
                </ComboBox>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...