1

我有一个 WPF 树视图。这是代码:

<DockPanel Grid.Row="2" Margin="0,6,0,0" Grid.RowSpan="5" Height="491" VerticalAlignment="Top">
        <DockPanel.Resources>

            <src:TreeViewFilter x:Key="MyList" />

            <HierarchicalDataTemplate DataType="{x:Type src:TreeViewParent}" ItemsSource="{Binding Path=OrderAttributes}">
                <TextBlock Text="{Binding Path=Name}" FontSize="16"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type src:OrderAttribute}" ItemsSource="{Binding Path=OrderAttributes}">
                <TextBlock Text="{Binding Path=NameAndCount}" />
            </HierarchicalDataTemplate>

        </DockPanel.Resources>
        <TreeView Name="treeView1" Height="490" Width="235" VerticalAlignment="Top" ItemsSource="{Binding Source={StaticResource MyList}, UpdateSourceTrigger=PropertyChanged}" TreeViewItem.Selected="treeViewFilter" />
    </DockPanel>

Treeview 绑定到静态资源 MyList 和 TreeViewParents 对象是在 TreeViewFilter 类中创建的:(删除了一些不必要的 SQL 代码来检索数据)。

public class TreeViewFilter : ObservableCollection<TreeViewParent>
{
    //three tree view parents that wont change
    public TreeViewParent allOrders;
    public TreeViewParent batchStatus;
    public TreeViewParent shippedOrders;
    static TreeViewFilter currentInstance1; //maybe set to null, can only create one instance!

    public TreeViewFilter()
    {

        currentInstance1 = this;

        //Create and fill out all orders tree filter
        Add(allOrders = new TreeViewParent("All Orders", 0));

        //Create and fill out batch status tree filter
        Add(batchStatus = new TreeViewParent("Batch Status", 0));
        int untouchedCount, batchReadyCount, errorCount;

        OrderAttribute untouched = new OrderAttribute("Untouched", "Batch Status", 3, untouchedCount);
        OrderAttribute batchReady = new OrderAttribute("Batch Ready", "Batch Status", 3, batchReadyCount);
        OrderAttribute error = new OrderAttribute("Error", "Batch Status", 3, errorCount);
        batchStatus.OrderAttributes.Add(untouched);
        batchStatus.OrderAttributes.Add(batchReady);
        batchStatus.OrderAttributes.Add(error);

        OrderManager currentInstance = OrderManager.getCurrentInstance();
    }

    public static TreeViewFilter getCurrentInstance()
    {
        return currentInstance1;
    }
}

然后树视图父母绑定到订单属性。订单属性也可以有自己的订单属性集合。(分层过滤树视图)

这是 TreeViewParent 和 OrderAttribute 代码:(两者都相似)

public class Base
{
    public int classIdentifier;
}

公共类 TreeViewParent : Base { 静态 TreeViewParent currentInstance;

    public TreeViewParent(string name, int classIdent)
    {
        this._name = name;
        this._orderAttributes = new ObservableCollection<OrderAttribute>();
        classIdentifier = classIdent;
        currentInstance = this;
    }

    public string _name;

    public string Name { get { return _name; } }

    ObservableCollection<OrderAttribute> _orderAttributes;
    public ObservableCollection<OrderAttribute> OrderAttributes 
    { 
        get { return _orderAttributes; }
    }

    public static TreeViewParent getCurrentInstance()
    {
        return currentInstance;
    }
}

公共类 OrderAttribute : Base { 公共字符串 parentFilter; 静态 OrderAttribute currentInstance;

    public OrderAttribute(string name, string parent, int classIdent)
    {
        _name = name;
        parentFilter = parent;
        classIdentifier = classIdent;
        _orderAttributes = new ObservableCollection<OrderAttribute>();
        currentInstance = this;
    }

    public OrderAttribute(string name, string parent, int classIdent, int count)
    {
        _name = name;
        parentFilter = parent;
        classIdentifier = classIdent;
        _count = count;
        currentInstance = this;
    }

    string _name;
    public int _count = 0;

    public string Name { get { return _name; } }

    public string NameAndCount
    {
        get
        {
            if (_count == 0)
            {
                return _name;
            }
            else
            {
                return _name + " (" + _count + ")";
            }
        }
    }

    ObservableCollection<OrderAttribute> _orderAttributes;
    public ObservableCollection<OrderAttribute> OrderAttributes { get { return _orderAttributes; } }

    public static OrderAttribute getCurrentInstance()
    {
        return currentInstance;
    }
}

当程序运行和计数发生变化时,如何使用依赖对象来显示和动态更改更新的 NameAndCount 数据?

4

1 回答 1

0

视图现在应该何时以及如何更改对象的NameAndCount属性。OrderAttribute

每次要向视图发送通知时,都必须实现INotifyPropertyChanged接口并引发事件。PropertyChanged

在您的示例中,当 _count 字段值更改时。

public OrderAttribute : Base, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private int _count = 0;

    public int Count
    {
        get { return _count; }
        set 
        {
             if(_count != value)
             {
                 _count = value;
                 FirePropertyChanged("NameAndCount");
             }
        }
    }
}
于 2012-09-13T08:10:54.797 回答