Привязка данных внутри другого элемента управления привязкой данных - в зависимости от текущего элемента - PullRequest
0 голосов
/ 29 октября 2009

Допустим, у вас есть список, который выглядит следующим образом

public List<Person> Persons { get; set; }

Вы устанавливаете ItemSource на ListBox, чтобы получать данные от лиц, и для каждого человека в этом списке вы хотите выбрать другие элементы в зависимости от номера социального страхования.

Запрещается сохранять данные в Person, поэтому данные должны быть выбраны после обработки Person в списке.

Это будет выглядеть примерно так: XAML

<ListBox Name="myListBox">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label Content="{Binding Name}"/>
                <ComboBox ItemsSource="{Binding MyOtherData}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Теперь я хочу, чтобы MyOtherData был методом, который будет возвращать набор данных, в зависимости от текущего человека, поэтому я просто хотел бы иметь метод, принимающий аргумент, такой как номер социального страхования.

Как это могло выглядеть?

Я новичок в WPF - XAML, и если это недостаток дизайна, пожалуйста, предложите другие решения на этот счет.

1 Ответ

1 голос
/ 30 октября 2009

Способ WPF сделать это - использовать конвертер. Создайте класс, который реализует IValueConverter, и добавьте в него атрибут ValueConversion. В атрибуте вы должны указать, из какого типа вы конвертируете, в какой тип int (защитный номер, вероятно, не int, но ...) в какой-то список, например массив String:

[ValueConversion(typeof(int), typeof(string[]))]
public class GetThatData : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
       return new string[]{"just","for","test"};
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Во-вторых, вам нужно импортировать пространство имен (если вы этого еще не сделали):

xmlns:local="clr-namespace:NamespaceWhereTheClassIs"

В-третьих, создайте объект класса:

<Window.Resources>
    <local:GetThatData x:Key="otherData" />
</Window.Resources>

И, наконец, примените конвертер с его значением:

 <ComboBox ItemsSource="{Binding Path=SSN, Converter={StaticResource otherData}}" />

просто чистая магия WPF, надеюсь, вы сможете заставить ее работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...