Я использую MvvmLight для управления элементом управления treeview
. Связывание в порядке, и мое Treeview
может получать данные из ViewModel
Однако произошло что-то странное.
В ViewModel
меня есть свойство типа string
:
private string foo;
public string Foo
{
get { return foo; }
set
{
if (foo== value)
return;
foo= value;
RaisePropertyChanged("Foo");
}
}
В конструкторе ViewModel
я инициализировал Foo
:
Foo = "Marry has a little lamb";
В View
я привязываю Foo
к treeview:
<TreeView HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding Foo}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate>
<TextBlock Text="{Binding}" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" Foreground="BurlyWood"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Я ожидал, что древовидное шоу покажет, что "у Мэри есть маленькая ягненка". Но вместо этого она показывает
M
a
r
r
...
По-видимому, он обрабатывал каждую букву как элемент. Я пытался изменить тип Foo на ObservableCollection<string>
Хотя он работает, по какой-то причине я не хочу менять тип Foo. Какая причина этого странного поведение и как его решить?
Я думаю, это потому, что вы привязываете TreeView
к своему свойству, которое является String
.
Дерево ожидает коллекцию некоторого типа и находит string
. Он думает, эй, я знаю, какая string
... это сборник chars
... и у него идет рубящий брак и ее бедный ягненок.
Таким образом, вам нужно либо "вставить" свои строки в коллекцию, либо изменить свою стратегию :)
Изменение: еще одна информация, если кто-то еще наткнется на это:
Из MSDN: ItemsControl.ItemsSource:
[BindableAttribute(true)]
public IEnumerable ItemsSource { get; set; }
И с удовольствием с ним:
var an_int = 4;
var a_string = "poor poor marry";
int[] an_array = new int[3] {1,2,3};
if (an_int is IEnumerable)
Console.WriteLine("you shouldn't see this");
if (a_string is IEnumerable)
Console.WriteLine("you should see this, as IEnumerable char");
if (an_array is IEnumerable)
Console.WriteLine("you should see this, as IEnumerable int");
ObservableCollection<T>
является правильным вариантом, спасибо.ObservableCollection<string>
как более конкретную, если хотите ...