Use a Converter :
CS :
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public Dictionary<int, string> MyDictionary
{
get
{
var dic = new Dictionary<int, string>();
dic.Add(1,"11111");
dic.Add(2,"22222");
dic.Add(3,"33333");
dic.Add(4,"44444");
return dic;
}
}
}
public class DictionaryConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DataGridRow row = (DataGridRow)values[0];
IDictionary<int,string> dic = (IDictionary<int,string>)values[1];
bool isId = bool.Parse(parameter.ToString());
var index = row.GetIndex();
KeyValuePair<int,string> kv = dic.ElementAt(index);
return isId ? kv.Key.ToString() : kv.Value;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML :
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MyDictionary}" CanUserAddRows="False">
<DataGrid.Resources>
<loc:DictionaryConverter x:Key="dicConverter" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="ID">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource dicConverter}" ConverterParameter="True">
<Binding Path="." RelativeSource="{RelativeSource AncestorType=DataGridRow}" />
<Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType=DataGrid}" />
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Name">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource dicConverter}" ConverterParameter="False">
<Binding Path="." RelativeSource="{RelativeSource AncestorType=DataGridRow}" />
<Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType=DataGrid}" />
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>