I have a WPF treeview. Here is the code:
<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>
The Treeview binds to the static resource MyList and TreeViewParents Objects are created in the TreeViewFilter class: (removed some unnecessary SQL code to retrieve data).
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;
}
}
Then the treeview parents bind to Order Attributes. Order Attributes can have there own collection of Order Attributes as well. (hierarchical filtering tree view)
Here is the TreeViewParent and OrderAttribute Code: (both are similiar)
public class Base
{
public int classIdentifier;
}
public class TreeViewParent : Base
{
static 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;
}
}
public class OrderAttribute : Base
{
public string parentFilter;
static 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;
}
}
How can i use dependency objects to have updated NameAndCount data be displayed and changed dynamically as the program runs and counts change?
The view should now when and how the
NameAndCountproperty of anOrderAttributeobject changed.You have to implement
INotifyPropertyChangedinterface and raisePropertyChangedevent every time when you want to send notification to your view.In your example when the _count fields value changes.