Связывание ключа и значения словаря в списке с помощью wpf

В то время, когда x=10 выполняется в вашем примере, класс не существует, но класс тоже не существует.

Выполнение в Python идет сверху вниз. Если x=10 находится выше метода класса, вы не можете получить доступ к методу класса в этой точке, потому что он еще не определен.

Даже если вы можете запустить классный метод, это не будет потому что класс еще не существует, поэтому метод класса не мог ссылаться на него. Класс не создается до тех пор, пока не будет запущен весь блок класса, поэтому пока вы находитесь внутри блока класса, нет класса.

Если вы хотите разделить некоторую инициализацию класса, чтобы вы могли повторно запустить его позже, как вы описываете, используйте декоратор класса. Декоратор класса работает после создания класса, поэтому он может просто вызвать класс.

>>> def deco(cls):
...     cls.initStuff()
...     return cls
>>> @deco
... class Foo(object):
...     x = 10
...     
...     @classmethod
...     def initStuff(cls):
...         cls.x = 88
>>> Foo.x
88
>>> Foo.x = 10
>>> Foo.x
10
>>> Foo.initStuff() # reinitialize
>>> Foo.x
88
13
задан stema 8 November 2013 в 13:19
поделиться

2 ответа

Код ниже покажет следующее:

1
Book 1
-------
2
Book 2
-------
3
Book 3

SelectedBookIndex будет установлен на индекс выбранной книги, при запуске будет выбрана вторая книга.

XAML:

<Window x:Class="TestDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">

    <StackPanel>
        <ListBox 
            ItemsSource="{Binding Path=Books}"
            SelectedValuePath="Value"
            SelectedValue="{Binding Path=SelectedBookIndex}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Black" BorderThickness="2">
                        <StackPanel>
                            <TextBlock Text="{Binding Path=Value}" />
                            <TextBlock Text="{Binding Path=Key.Name}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Window>

Код, стоящий за:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;

namespace TestDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Books = new Dictionary<Book, int>();
            Books.Add(new Book() { Name = "Book 1"}, 1);
            Books.Add(new Book() { Name = "Book 2" }, 2);
            Books.Add(new Book() { Name = "Book 3" }, 3);

            SelectedBookIndex = 2;

            DataContext = this;
        }

        public Dictionary<Book, int> Books { get; set; }

        private int _selectedBookIndex;
        public int SelectedBookIndex
        {
            get { return _selectedBookIndex; }
            set
            {
                _selectedBookIndex = value;
                Debug.WriteLine("Selected Book Index=" + _selectedBookIndex);
            }
        }
    }

    public class Book
    {
        public string Name { get; set; }
    }
}
33
ответ дан 1 December 2019 в 19:49
поделиться

Удалите DataContext = "{StaticResource BookData}" из элемента сетки.

ObjectDataProvider создаст новый пустой BookList, и ваш TextBlock наследует этот DataContext. Если вы удалите этот атрибут, TextBlock получит свой DataContext из текущего элемента ItemsControl, который будет KeyValuePair для этой строки. Вероятно, вы можете полностью удалить элемент ObjectDataProvider, поскольку вы создаете данные в коде.

0
ответ дан 1 December 2019 в 19:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: