另一个数据绑定控件内的数据绑定 - 取决于当前项目

时间:2009-10-29 10:31:54

标签: wpf data-binding

假设您有一个类似于以下内容的列表

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 个答案:

答案 0 :(得分:1)

WPF的方法是使用转换器。执行一个实现IValueConverter的类,并将Attribute ValueConversion添加到它。在属性中你必须说明你转换为哪种类型,int(安全号可能不是一个int但是......)可能某种列表是一个字符串数组:

[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>

最后应用转换器whit值:

 <ComboBox ItemsSource="{Binding Path=SSN, Converter={StaticResource otherData}}" />
纯粹的WPF魔术,希望你能让它发挥作用