WPF Treeview печатает свойство строкового типа и рассматривает каждую букву как элемент

1

Я использую 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. Какая причина этого странного поведение и как его решить?

Теги:
xaml
wpf
treeview
mvvm-light

1 ответ

1
Лучший ответ

Я думаю, это потому, что вы привязываете 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");
  • 0
    Теперь я понимаю, что ObservableCollection<T> является правильным вариантом, спасибо.
  • 0
    Добавил еще несколько примеров. Вы также можете использовать ObservableCollection<string> как более конкретную, если хотите ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню