Как прочитать значения подэлемента из WPF / XAML ListView? - PullRequest
2 голосов
/ 31 августа 2009

Достаточно, достаточно - я потратил час на поиски, пытаясь выяснить, как читать значения ListViewSubItem (если это правильная терминология в XAML) из ListView. Вот маленький ListView:

<ListView x:Name="CreatableAccounts" ItemsSource="{Binding Processable}" Margin="10,0">
        <ListView.View>
              <GridView>
                    <GridViewColumn Header="Site Name" DisplayMemberBinding="{Binding SiteName}"/>
                    <GridViewColumn Header="From Package" DisplayMemberBinding="{Binding FiCodeDLL.Name}"/>
                </GridView>
         </ListView.View>
</ListView>

и вот моя попытка прочитать значения, которые явно не будут работать:

private void CreateAccounts_Click(object sender, RoutedEventArgs e)
    {
        ListViewItem selected = CreatableAccounts.SelectedItem;
        selected.Ite //  no Items, Text or similar property


    }

Кто-нибудь может указать мне правильное направление? Заранее спасибо за помощь!

1 Ответ

3 голосов
/ 31 августа 2009

ListView имеет свойство зависимости SelectedItem, к которому вы можете привязать экземпляр дочернего элемента вашей коллекции, таким образом:

<DockPanel>
    <Button DockPanel.Dock="Top" Click="Button_Click">Selected Item</Button>
    <ListView ItemsSource="{Binding AllItems}" SelectedItem="{Binding SelectedItem}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" />
            </GridView>
        </ListView.View>
    </ListView>
</DockPanel>

Теперь вы можете создать ViewModel, который представляет ObservableCollection, заполненную вашими элементами, и один экземпляр элемента, который является вашим SelectedItem ...

что-то вроде:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        WindowViewModel vm = new WindowViewModel();
        this.DataContext = vm;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        WindowViewModel vm = this.DataContext as WindowViewModel;
        MessageBox.Show(vm.SelectedItem.Name);
    }

}

public class WindowViewModel
{
    public WindowViewModel()
    {
        AllItems = new ObservableCollection<Person>();
        AllItems.Add(new Person { Name = "Joe", Age = 26 });
        AllItems.Add(new Person { Name = "Mary", Age = 23 });
        AllItems.Add(new Person { Name = "Bill", Age = 32 });
        AllItems.Add(new Person { Name = "Harry", Age = 36 });
        AllItems.Add(new Person { Name = "Julie", Age = 18 });
        AllItems.Add(new Person { Name = "Claire", Age = 42 });
    }

    public ObservableCollection<Person> AllItems { get; set; }

    private Person _selectedItem;
    public Person SelectedItem
    {
        get { return _selectedItem; }
        set { _selectedItem = value; }
    }
}

public class Person : INotifyPropertyChanged
{

    private string _name;
    private int _age;

    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                RaisePropertyChanged("Name");
            }
        }
    }

    public int Age
    {
        get { return _age; }
        set
        {
            if (_age != value)
            {
                _age = value;
                RaisePropertyChanged("Age");
            }
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

Надеюсь, это поможет:)

Ian

...