WPF数据绑定未显示

时间:2012-11-26 17:04:35

标签: c# wpf xaml data-binding

所以我有一个简单的XAML数据绑定错误。我在下面的XAML中有两个类(到目前为止),它们用于DataBinding,一个包含ObservableCollection行的Row。节点有一堆额外的相关信息,我试图以类似网格的方式显示这些节点(它将用于路径查找算法。)

问题是“Here”TextBlock没有显示出来。但我知道节点正在被绑定,因为它们的值显示在Debugging StackPanel中。

<Window.Resources>
    <local:Row x:Key="TestRow">
        <local:Node x="0" y="0" Cost="20" />
        <local:Node x="0" y="1" Cost="20" />
        <local:Node x="0" y="2" Cost="20" />
    </local:Row>
</Window.Resources>
<Grid Name="MainGrid" Margin="10,10,10,10" >
    <Grid.RowDefinitions>
        <RowDefinition Height="150" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <StackPanel Margin="0,25,0,0" 
                DataContext="{Binding ElementName=AStarListView, 
                                      Path=SelectedItem}" 
                x:Name="Debugging" Orientation="Vertical" >
        <TextBlock Text="{Binding x}" />
        <TextBlock Text="{Binding y}" />
        <TextBlock Text="{Binding Cost}" />
    </StackPanel>
    <ListView Grid.RowSpan="2" Margin="2,2,2,2" Grid.Column="1" 
              x:Name="AStarListView" 
              ItemsSource="{StaticResource TestRow}" >
        <ListView.ItemTemplate>
            <DataTemplate DataType="local:Row">
                <ListView ItemsSource="{Binding nodes}" Width="48" Height="48" >
                    <ListView.ItemTemplate>
                        <DataTemplate DataType="local:Node"> 
                            <TextBlock Text="Here" />
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

这是(剥离的)Node类。

public class Node : INotifyPropertyChanged
{
    public Tuple<int, int> coordinates { get; set; }

    public int x
    {
        get
        {
            if (this.coordinates == null)
                return -1;
            return this.coordinates.Item1;
        }
        set
        {
            if (this.coordinates != null)
                this.coordinates = new Tuple<int, int>(value, y);
            else
                this.coordinates = new Tuple<int, int>(value, -1);

            OnPropertyChanged("x");
        }
    }
    public int y
    {
        get
        {
            if (this.coordinates == null)
                return -1;
            return this.coordinates.Item2;
        }
        set
        {
            if (this.coordinates != null)
                this.coordinates = new Tuple<int, int>(x, value);
            else
                this.coordinates = new Tuple<int, int>(-1, value);
            OnPropertyChanged("y");
        }
    }

    private Node _parent;

    private int _Cost;
    public int Cost
    {
        get
        {
            return _Cost;
        }
        set
        {
            _Cost = value;
            OnPropertyChanged("Cost");
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChangedEventArgs args = 
                 new PropertyChangedEventArgs(propertyName);
            this.PropertyChanged(this, args);
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

这是Row类:

public class Row : ObservableCollection<Node>
{
    public ObservableCollection<Node> nodes { get; set; }

    public Row()
    {
        this.nodes = new ObservableCollection<Node>();
    }
}

1 个答案:

答案 0 :(得分:1)

这是更正后的XAML,类定义在问题中是正确的,需要用这个XAML替换“AStarListView”。

<ListView Grid.RowSpan="2" Margin="2,2,2,2" Grid.Column="1" x:Name="AStarListView" 
           ItemsSource="{StaticResource TestRow}" >

     <ListView.ItemTemplate>
         <DataTemplate DataType="local:Node">
             <Grid Background="#dddddd" >
                 <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding x}"/>
                 <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding y}"/>
                 <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Cost}"/>
                 <Grid.RowDefinitions>
                     <RowDefinition Height="24"/>
                     <RowDefinition Height="24"/>
                 </Grid.RowDefinitions>
                 <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="24"/>
                     <ColumnDefinition Width="24"/>
                 </Grid.ColumnDefinitions>
             </Grid>
         </DataTemplate>
     </ListView.ItemTemplate>
 </ListView>

我的问题是我的ListViews嵌套得太深了。内部ListView绑定到Node的“nodes”属性,该属性不存在。