WPF DataTemplate方法与参数绑定

时间:2012-06-19 14:50:17

标签: c# wpf binding datatemplate

我有一个ListBox的自定义ItemTemplate,我需要将TextBlock“绑定”到一些特殊的方法/属性。

我的ListBox来源是ObservableCollection<SearchResultItem>SearchResultItem包含一些属性。

文本需要根据另一个对象的值进行更改。 E.G如果此对象等于“foo”,我需要文本值来调用GetProperty("foo")上的方法SearchResultItem以获得正确的值。

以下是代码示例:

<DataTemplate>
..
//Here is a Label bound to the Date Property of the SearchResultItem
<Label Margin="2,2,2,0" Grid.Row="0" Grid.Column="2" Content="{Binding Path=Date}" HorizontalAlignment="Right" HorizontalContentAlignment="Right" />
//Here is the textblock that needs to call the method with the parameter based on the value of the other object.
<TextBlock Margin="2,2,2,0" TextTrimming="CharacterEllipsis"  Grid.Row="0" Grid.Column="1" Text="I need some help there" HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Black"/>
..
</DataTemplate>

您对如何做到或更好的方法有任何想法吗?

编辑:

- 假设SearchResultItem来自外部库,只展示GetProperty方法。

- 假设“foo”值来自ConfigurationManager.AppSettings["propertyName"];,如果有帮助的话。

2 个答案:

答案 0 :(得分:0)

好的,因为你的属性永远不会改变,这是一个解决方案。您可以通过SearchResultItem类上的其他属性执行此操作:

public string MyTextBinding
{
    get 
    {
        return myDictionary.ContainsKey("foo") ? return myDictionary["foo"] : return "myDictionary doesn't contain foo"; 
    }
}

然后将文本框绑定到此属性:

<DataTemplate>    
    <Label Margin="2,2,2,0" Grid.Row="0" Grid.Column="2" Content="{Binding Path=Date}" HorizontalAlignment="Right" HorizontalContentAlignment="Right" />
    <TextBlock Margin="2,2,2,0" TextTrimming="CharacterEllipsis"  Grid.Row="0" Grid.Column="1" Text="{Binding Path=MyTextBinding, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Black"/>
</DataTemplate>

答案 1 :(得分:0)

只需使用IValueConverter SearchResultItem并返回预期文字

即可
<TextBlock Margin="2,2,2,0" TextTrimming="CharacterEllipsis" 
           Grid.Row="0" Grid.Column="1" 
           Text="{Binding Path=., 
                Converter={StaticResource PropertyValueFromSearchResultItemConverter}, 
                ConverterParameter=Foo}" 
           HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Black"/>