繁体   English   中英

WPF绑定到特定属性

[英]WPF Binding to specific property

我是DataBinding的新手,但想完成以下工作:

我有一个ViewModel,其中包含对象的集合: CollectionOfStuff

每个对象Stuff都有一些属性: NameValue

在我的视图中,我有一个带有某些TextBlockStackPanel 我想将TextBlock的Text属性绑定到特定属性。 (我想绑定到ValueNameStuff是“有些名”)

在我的StackPanel我已经将DataContext设置为集合。

但是对于文本块,当我尝试... Text="{Binding Path=Value"} ...我只得到CollectionOfStuff的第一个对象。 Name为“ some name”时,如何选择性地绑定到对象的Value

认为 ,根据您的描述,您想使用ItemsControl,默认情况下它由StackPanel支持。 它将显示具有给定模板的所有项目(我提供了一个非常简单的模板)。 它看起来像这样:

<ItemsControl ItemsSource="{Binding CollectionOfStuff}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock HorizontalAlignment="Left" Text="{Binding Name}" />
                <TextBlock HorizontalAlignment="Right" Text="{Binding Value}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

那是你想做的吗? 如果是这样,则忽略其余部分。

但是,如果要绑定到列表中的特定项目,则需要确保CollectionOfStuff强制使用this[string index]索引器(非常重要的步骤)。 然后,您可以按名称进行标注:

<StackPanel DataContext="{Binding CollectionOfStuff['theName']}"></StackPanel>
    <TextBlock HorizontalAlignment="Left" Text="{Binding Name}" />
    <TextBlock HorizontalAlignment="Right" Text="{Binding Value}" />
</StackPanel>

如果您要走这条路线,但您无法控制CollectionOfStuff的集合类型,那么您始终可以在ViewModel上创建自己的索引器:

public object this[string indexer]
{
    get
    {
        return CollectionOfStuff.FirstOrDefault(s => s.Name == indexer);
    }
}

然后,您在StackPanel上的DataContext将如下所示: DataContext="{Binding ['theName']}"

我想这一切都取决于您到底要做什么。 您的解决方案是在这个答案的某个地方:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM