gpt4 book ai didi

.net - 绑定(bind)到接口(interface)类型属性

转载 作者:行者123 更新时间:2023-12-02 12:18:12 24 4
gpt4 key购买 nike

我刚刚遇到了 WPF 中的另一个绑定(bind)异常。考虑以下类及其名为 MyStupidIStupid 类型属性:

public struct DumbClass
{
public IStupid MyStupid { get { return new IsStupid(); } }
}
public interface IStupid{}
public class IsStupid : IStupid{}

现在考虑以下到 ListBox 的绑定(bind):

var items = new List<DumbClass>(new []{new DumbClass(), new DumbClass(), new DumbClass()});
OptListBox.ItemsSource = items;

xaml 没有什么特别的:

<ListBox Name="OptOccurances" Height="238" HorizontalAlignment="Left" Margin="130,34,0,0" VerticalAlignment="Top" Width="229" >
</ListBox>

正如预期的那样,列表框的输出是 3 行“MyProject.DumbClass”。

但是,如果我设置 DisplayMemberPath="MyStupid" (或创建一个 ItemTemplate,将“MyStupid”直接绑定(bind)到模板中的 TextBlock),当我期望它时,我会得到 3 个空行说MyProject.IsStupid。为什么数据绑定(bind)引擎无法调用默认的 ToString() 实现并显示类名。接口(interface)类型属性有解决方法吗?至少,有没有抛出绑定(bind)错误的原因?

最佳答案

我可以重现这个问题。看起来像是 WPF 错误。

以下是您可以使用的解决方法:您可以使用带有 StringFormat 参数的 Item 的 DataTemplate 来代替 DisplayMemberPath,这将强制将属性值转换为字符串:

    <ListBox x:Name="OptOccurances" Height="238" HorizontalAlignment="Left" Margin="130,34,0,0" VerticalAlignment="Top" Width="229" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=MyStupid, StringFormat='{}{0}' }"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

通常你可以使用WPF跟踪设置来解决此类问题: enter image description here

但在这种情况下,我没有看到任何绑定(bind)错误发生。

此外,您还可以使用 Visual Studio 2012 的 WPF Visualizer,它允许您直接从调试监视中调查树: enter image description here

使用以下代码,您可以获得 TextBlock 及其绑定(bind):

    private void btn_Click_1(object sender, RoutedEventArgs e)
{
var listBoxItem = OptOccurances.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
var item = OptOccurances.Items[1] as DumbClass;
var tbk = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(listBoxItem, 0),0),0) as TextBlock;
var binding = BindingOperations.GetBinding(tbk, TextBlock.TextProperty);
var be = BindingOperations.GetBindingExpression(tbk, TextBlock.TextProperty);
var vs = DependencyPropertyHelper.GetValueSource(tbk, TextBlock.TextProperty);
var val = tbk.GetValue(TextBlock.TextProperty);
}

并且表明Binding状态实际上是事件的并且映射的对象是正确的。显然,Binding (PropertyPathWorker) 的内部工作方式在获取属性类型的值时有所不同

关于.net - 绑定(bind)到接口(interface)类型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16309863/

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