C#如何使用ListView selecteditem

时间:2018-07-03 09:42:42

标签: c# wpf listview selecteditem

我是C#和WPF的新手。我已经开始了一个新项目,以学习如何同时使用它们以及如何构建UI。熊熊开始,我一直坚持使用listview集合中的selecteditem。我试图显示一些从选定对象中获取的基本信息。在表单上,​​我添加了标签和一些按钮。主要目标是打开第二个表单,其中包含有关所选记录的详细信息。但是首先,我想实现一些简单的操作-仅在标签控件中显示记录ID。我可以获取记录,并用记录填充列表框,但是所有读取所选数据的尝试都失败了(标签上没有任何显示)。您能否帮助我,并向我展示如何在标签方案中使用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 :(得分:1)

您好,许多问题之一是Label仅在初始化时才获取值。 SelectedInventory已正确更新,但标签无法识别。要实现这一点,请阅读INotifyPropertyChanged界面,以获取更多信息here

接口的实现

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));
}

答案 1 :(得分:1)

  

能否请您帮助我,并向我展示如何在标签方案中使用selecteditem?

您可以直接绑定到SelectedItem的{​​{1}}属性:

ListView

但是要绑定到<Label x:Name="lblInventoryId" Content="{Binding SelectedItem.Inventory_id, ElementName=lstInventory}" ... /> 属性,您应该做的是将窗口的SelectedInventory设置为DataContext对象:

DataAccess

然后,如果您在XAML中绑定的public MainWindow() { InitializeComponent(); DataContext = new DataAccess(); } GetInventory类的公共属性,则绑定应该起作用:

DataAccess

您无法绑定到方法。因此,您应该在ItemsSource="{Binding GetInventory}" 类中调用GetIventory()方法,并通过属性公开结果,例如:

DataAccess

XAML:

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

    public IEnumerable Inventories { get; private set; }

   //...
}

还要注意,ItemsSource="{Binding Inventories}" 应该实现DataAccess接口,并在每次设置INotifyPropertyChanged属性时向UI发出通知。有关更多信息,请参考MSDN

答案 2 :(得分:0)

ListView的ItemsSource必须绑定到IEnumerable类型或派生的属性,在wpf中不支持绑定到方法。