Одно преимущество для второго метода состоит в том, что можно перенести его с Collections.unmodifiableMap()
, чтобы гарантировать, что ничто не собирается обновить набор позже:
private static final Map<Integer, String> CONSTANT_MAP =
Collections.unmodifiableMap(new HashMap<Integer, String>() {{
put(1, "one");
put(2, "two");
}});
// later on...
CONSTANT_MAP.put(3, "three"); // going to throw an exception!
Следуя тому, что сказал Филипп, DataGrid
обычно привязан к данным. Ниже приведен пример, в котором мой WPF DataGrid
привязан к ObservableCollection
, где PersonName
состоит из FirstName
и LastName
(обе строки).
DataGrid
поддерживает автоматическое создание столбцов, поэтому пример довольно прост. Вы увидите, что я могу получить доступ к строкам по их индексу и получить значение ячейки в этой строке, используя имя свойства, соответствующее имени столбца.
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
// Create a new collection of 4 names.
NameList n = new NameList();
// Bind the grid to the list of names.
dataGrid1.ItemsSource = n;
// Get the first person by its row index.
PersonName firstPerson = (PersonName) dataGrid1.Items.GetItemAt(0);
// Access the columns using property names.
Debug.WriteLine(firstPerson.FirstName);
}
}
public class NameList : ObservableCollection<PersonName>
{
public NameList() : base()
{
Add(new PersonName("Willa", "Cather"));
Add(new PersonName("Isak", "Dinesen"));
Add(new PersonName("Victor", "Hugo"));
Add(new PersonName("Jules", "Verne"));
}
}
public class PersonName
{
private string firstName;
private string lastName;
public PersonName(string first, string last)
{
this.firstName = first;
this.lastName = last;
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
}
}
Обычно содержимое ячейки DataGrid привязано к данным и, следовательно, отражает состояние свойства (в большинстве случаев) объекта, отображаемого в данной строке. Следовательно может быть проще получить доступ к модели, чем к представлению.
Сказав это (модель доступа, а не представление), мой вопрос: что вы пытаетесь сделать? Вы ищете способы обхода визуального дерева , чтобы найти элемент управления (или элементы управления), отображаемый на экране? Как вы собираетесь ссылаться на ячейку по индексу строки и столбца?
Если вы выполняете привязку с использованием DataTable, вы можете получить DataRowView из свойства элемента строки.
DataRowView rowView = e.Row.Item as DataRowView;