I'm not sure how to go about this exactly. I have a static ObservableCollection in the NameField.cs class. I just have no idea how to bind it to the listbox.
- Should I not be using a ListBox?
- Should I be using a DependencyProperty?
- Should I be exposing the ObservableCollection through a property or by public?
I'm not sure what to do here...
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace MyWPF
{
[TemplatePart(Name = NameField.ElementPrefixBox, Type = typeof(ListBox))]
public class NameField : Control
{
private const String ElementPrefixBox = "PART_PrefixBox";
private static ObservableCollection<NamePrefix> _namePrefixes;
static NameField()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(NameField), new FrameworkPropertyMetadata(typeof(NameField)));
_namePrefixes = new ObservableCollection<NamePrefix>();
}
public static void AddNamePrefix(NamePrefix namePrefix)
{
lock (_namePrefixes)
{
_namePrefixes.Add(namePrefix);
}
}
public static IEnumerator<NamePrefix> GetNamePrefixes()
{
return _namePrefixes.GetEnumerator();
}
}
/// <summary>
/// A Key/Value structure containing a Name Prefix ID and String value.
/// </summary>
public struct NamePrefix
{
public NamePrefix(Int32 id, String prefix)
: this()
{
ID = id;
Prefix = prefix;
}
public Int32 ID { get; set; }
public String Prefix { get; set; }
}
}
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWPF"
xmlns:con="clr-namespace:MyWPF.Converters"
>
<Style TargetType="{x:Type local:NameField}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:NameField}">
<StackPanel Orientation="Horizontal">
<TextBlock TextWrapping="NoWrap" Text="Name:" VerticalAlignment="Center" Margin="3" />
<ListBox x:Name="PART_PrefixBox" VerticalAlignment="Center" Margin="3" >
<ListBox.ItemBindingGroup>
<BindingGroup Name="NamePrefixes"/>
</ListBox.ItemBindingGroup>
</ListBox>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>