C # как использовать ListView selecteditem - PullRequest
0 голосов
/ 03 июля 2018

Я очень новичок в C # и WPF. Я начал новый проект, чтобы узнать, как использовать их вместе и как создавать пользовательский интерфейс. Bearly начал, я застрял на использование selecteditem из коллекции listview. Я пытался отобразить некоторую основную информацию, взятую из выбранного объекта. На форме я добавил ярлык и несколько кнопок. Основной целью было открыть вторую форму с подробной информацией о выбранной записи. Но сначала я хотел добиться чего-то простого - просто отобразить идентификатор записи в контроллере метки. Я могу получить записи и заполнить список записями, но все попытки прочитать выбранные данные потерпели неудачу (в ярлыке ничего не отображается). Не могли бы вы помочь мне и показать, как использовать selecteditem со сценарием метки? И, надеюсь, дайте мне несколько советов по сценарию с подробным окном тоже ... В любом случае - все комментарии, касающиеся моего кода, будут оценены, будьте терпеливы и помните, что это мой первый подход к этой теме.

Для вашего удобства весь код доступен на BitBucket: https://bitbucket.org/is-smok/gama

Спасибо за любую помощь.

Часть файла MainWindow.xaml

    <Grid>
    <ListView x:Name="lstInventory" Height="180" Margin="5,51,79,0" VerticalAlignment="Top" 
              ItemsSource="{Binding GetInventory}"  
              SelectedItem="{Binding SelectedInventory, Mode=TwoWay}" 
              DisplayMemberPath="Inventory_id">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="GamaID" DisplayMemberBinding="{Binding Inventory_id}" />
                <GridViewColumn Header="Typ"  DisplayMemberBinding="{Binding Serial_number}" />
                <GridViewColumn Header="Producent"  DisplayMemberBinding="{Binding Registry_number}" />
            </GridView>
        </ListView.View>
    </ListView>
    <Button Content="Add" HorizontalAlignment="Left" Margin="57,265,0,0" VerticalAlignment="Top" Width="75"   Click="AddInventory_Click"/>
    <Button Content="Remove" HorizontalAlignment="Left" Margin="137,265,0,0" VerticalAlignment="Top" Width="75"   Click="RemoveInventory_Click"/>
    <Button Content="Edit" HorizontalAlignment="Left" Margin="217,265,0,0" VerticalAlignment="Top" Width="75"  Click="EditInventory_Click"/>
    <Label Content="{Binding SelectedInventory.Serial_number}" HorizontalAlignment="Left" Margin="120,326,0,0" VerticalAlignment="Top" Height="24" Width="140"/>
    <Label x:Name="lblInventoryId" Content="{Binding SelectedInventory.Inventory_id}" HorizontalAlignment="Left" Margin="10,326,0,0" VerticalAlignment="Top" Height="24" Width="105"/>
</Grid>

Часть MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();

        DataAccess dataAccess = new DataAccess();
        inventory = dataAccess.GetIventory();
        lstInventory.ItemsSource = inventory;
        lstInventory.DisplayMemberPath = "inventory_id";
    }

Часть файла DataAccess.cs

    private Inventory m_SelectedInventory;
    public Inventory SelectedInventory
    {
        get
        {
            return m_SelectedInventory;
        }
        set
        {
            m_SelectedInventory = value;
        }
    }

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Привет, одна из многих проблем заключается в том, что метка получает значение только при инициализации. SelectedInventory обновляется правильно, но метка не распознает его. Чтобы достичь этого, прочитайте об интерфейсе INotifyPropertyChanged, для получения дополнительной информации здесь

Реализация интерфейса:

public event PropertyChangedEventHandler PropertyChanged;
public Inventory SelectedInventory
{
    get
    {
        return m_SelectedInventory;
    }
    set
    {
        m_SelectedInventory = value;
        RaisePropertyChanged(nameof(SelectedInventory));
    }
}

private void RaisePropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
0 голосов
/ 03 июля 2018

Не могли бы вы помочь мне и показать, как использовать selecteditem со сценарием метки?

Вы можете связать напрямую со свойством SelectedItem ListView:

<Label x:Name="lblInventoryId" Content="{Binding SelectedItem.Inventory_id, ElementName=lstInventory}" ... />

Но чтобы связать свое свойство SelectedInventory, вы должны установить для DataContext окна объект DataAccess:

public MainWindow()
{
    InitializeComponent();

    DataContext = new DataAccess();
}

Тогда привязки должны работать при условии, что GetInventory, к которому вы привязываете в вашем XAML, является общедоступным свойством класса DataAccess:

ItemsSource="{Binding GetInventory}"  

Вы не можете привязать метод. Поэтому вы должны вызвать метод GetIventory() в вашем классе DataAccess и представить результаты через свойство, например ::1010 *

public DataAccess
{
    public DataAccess()
    {
        Inventories = GetIventory();
    }

    public IEnumerable Inventories { get; private set; }

   //...
}

XAML:

ItemsSource="{Binding Inventories}"

Также обратите внимание, что DataAccess должен реализовывать интерфейс INotifyPropertyChanged и генерировать уведомление для пользовательского интерфейса каждый раз, когда устанавливается свойство SelectedInventory. Пожалуйста, обратитесь к MSDN для получения дополнительной информации об этом.

0 голосов
/ 03 июля 2018

ItemsSource ListView должен быть связан с свойством типа IEnumerable или производным, привязка к методу не поддерживается в wpf.

...