gpt4 book ai didi

wpf - MarkupExtension 作为模板中的计算属性

转载 作者:行者123 更新时间:2023-12-05 00:09:16 25 4
gpt4 key购买 nike

有这样的 MarkupExtension

public class Extension1 : MarkupExtension
{
private static int _counter = 0;

public override object ProvideValue(IServiceProvider serviceProvider)
{
return string.Format("Item {0}", _counter++);
}
}

和这个 XAML
<ListBox>
<ListBoxItem Content="{my:Extension1}"></ListBoxItem>
<ListBoxItem Content="{my:Extension1}"></ListBoxItem>
<ListBoxItem Content="{my:Extension1}"></ListBoxItem>
</ListBox>

我得到这样的 list :
Item 1
Item 2
Item 3

现在我尝试使用此样式生成相同的列表
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<TextBox Text="{my:Extension1}"></TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

并且有了这样的 XAML
<ListBox ItemsSource="{StaticResource data}"></ListBox>

我明白了
Item 0
Item 0
Item 0

所以 {my:Extension1} 只评估了一次。我可以创建一个将为每个项目评估的计算属性吗?

最佳答案

Try returning an object from ProvideValue instead of a string



Phil 走在正确的轨道上...实际上,您需要返回 this来自 ProvideValue如果您的标记扩展是从模板调用的。这将导致为模板生成的每个控件评估标记扩展。确定是否调用 ProvideValue来自模板,您需要检查目标对象:在模板中,它将是 System.Window.SharedDp 类型.我写了一个 blog post关于那个。

关于wpf - MarkupExtension 作为模板中的计算属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/671941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com