WPF绑定返回错误的Object

时间:2011-01-18 09:02:54

标签: c# wpf data-binding listbox datatemplate

我在WPF中有一个ListBox,我将Code中的ItemsSource属性设置为“List”列表

当我现在运行程序时,我得到一个带有我的类名的List,其中包含了List所包含的内容。多数民众赞成。

现在我隐藏了以下Datatemplate:

<DataTemplate>
     <NetworkEditor:NetworkEditor DisplayNetwork="{Binding}"></NetworkEditor:NetworkEditor>
</DataTemplate>

但是对DependencyPropery“DisplayNetwork”总是传递“null”(我用DebugValueConverter对它进行了测试)。

任何想法?

列表框的Xaml:

<ListBox Name="myLst" Grid.Row="3" HorizontalAlignment="Stretch"  HorizontalContentAlignment="Stretch" >
       <ListBox.ItemTemplate>               
            <DataTemplate>
                <NetworkEditor:NetworkEditor DisplayNetwork="{Binding}"></NetworkEditor:NetworkEditor>
            </DataTemplate>          
        </ListBox.ItemTemplate> 
    </ListBox>

在我的UserControl中实现属性:

public Network DisplayNetwork
    {
        get { return (Network)GetValue(DisplayNetworkProperty); }
        set { SetValue(DisplayNetworkProperty, value); }
    }

    // Using a DependencyProperty as the backing store for DisplayNetwork.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DisplayNetworkProperty =
        DependencyProperty.Register("DisplayNetwork", typeof(Network), typeof(NetworkEditor), new FrameworkPropertyMetadata(null, OnDisplayNetworkChanged, CoerceValueCallback));

    private static Object CoerceValueCallback(DependencyObject d,Object baseValue)
    {
        return baseValue;
    }

永远不会调用OnDisplayNetworkChanged,因为null始终设置为Value!

我的ListBox的数据源:

myLst.ItemsSource = ((S7FunctionBlock) myBlock).Networks;

其中Networks是List,当我调试此Line时,它包含数据!

2 个答案:

答案 0 :(得分:2)

如果你在那里设置了DataContext,你有没有检查过你的NetworkEditor:NetworkEditor类。在一个类中设置DataContext然后尝试从Xaml访问此标签上的DataContext是一个经常犯的错误。将返回父级DataContext。

要检查此项,请尝试将XAML更改为以下内容。

<DataTemplate>      
    <Grid>
        <NetworkEditor:NetworkEditor DisplayNetwork="{Path=DataContext,RelativeSource={RelativeSource,Mode=FindAncestor,AncestorType=Grid}}">
        </NetworkEditor:NetworkEditor> 
    </Grid>
</DataTemplate> 

如果有错误,请发表评论,我还没有测试过。然而,正如Will Dean所说,在这种情况下,如果它受你的控制,更改NetworkEditor将是一个好主意。

答案 1 :(得分:1)

正如HCL所说,该控件的DataContext可能不是你想象的那样。

要诊断这一点,您可以将{Binding}更改为{Binding SomethingThatDoesntExist},然后在VS中启用绑定警告。绑定警告消息将告诉您为“SomethingThatDoesntExist”检查了哪种类型的对象 - 您可能会发现它不是您所期望的。

如果事实证明NetworkEditor正在将其DataContext设置为与您的想法不同的东西,那么这个问题的一个很好的解决方案(如果NetworkEditor在您的控制下),就是更改为在第一个对象上设置DataContext在NetworkEditor中(通常是典型UserControl中的Grid),而不是NetworkEditor对象本身。