Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用数据模板从ListView中的Selecteditem获取样式_C#_Wpf - Fatal编程技术网

C# 使用数据模板从ListView中的Selecteditem获取样式

C# 使用数据模板从ListView中的Selecteditem获取样式,c#,wpf,C#,Wpf,我试图从ListView中获取数据,但在获取来自DataTemplate的数据时遇到问题 //wpf code (basic) <ListView x:Name="anotherList"> <ListViewItem Tag="aTag" Content="A"/> <ListViewItem Tag="bTag" Content="B"/> </ListView> 现在,当我尝试在其中包含DataTemplate时,我不能使用

我试图从ListView中获取数据,但在获取来自DataTemplate的数据时遇到问题

//wpf code (basic)
<ListView x:Name="anotherList">
    <ListViewItem Tag="aTag" Content="A"/>
    <ListViewItem Tag="bTag" Content="B"/>
</ListView>
现在,当我尝试在其中包含DataTemplate时,我不能使用相同的方法访问wpf中的数据

//wpf code using data template
<ListView x:Name="mainList">
    <ListView.ItemsSource>
        // Accessing data from an inline xml table
        <Binding Source="{StaticResource Book1}" XPath="Entry"/> 
    </ListView.ItemsSource>
    <ListView.ItemTemplate>
        <DataTemplate>
            <ListViewItem Tag="{Binding XPath=Tag}" Content="{Binding XPath=LastName}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
我不知道如何继续使用c代码,因为我选择的项目作为一个完整的XML内容字符串出现,无法访问内容或标记。(即,它正确地显示在可视化树中,但ListViewItem的行为与ListViewItem对象不同。)是否有办法更改我的WPF代码,以便我可以像基本c#代码那样从后面访问样式


非常感谢您的帮助和阅读

这个基于MVVM的方法对我来说很有效

XAML:


你到底想说什么?您应该绑定到实际对象(包括
SelectedItem
),而不是UI控件。DataTemplate是否仅修改UI?如何将属性绑定到实际对象?听起来您应该学习MVVM教程:谢谢您的帮助。这是我看到的第一个无需注释就能真正理解的MVVM,因为它与我的问题直接相关。我以后得试一下。
//wpf code using data template
<ListView x:Name="mainList">
    <ListView.ItemsSource>
        // Accessing data from an inline xml table
        <Binding Source="{StaticResource Book1}" XPath="Entry"/> 
    </ListView.ItemsSource>
    <ListView.ItemTemplate>
        <DataTemplate>
            <ListViewItem Tag="{Binding XPath=Tag}" Content="{Binding XPath=LastName}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
//c# code
//gives null
var selectedItem = (ListViewItem)mainList.SelectedItem //....;
// throws exception
String selectedContent = selectedItem.Content;
<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800"
    d:DataContext="{d:DesignInstance local:MyViewModel}">
<Grid>
    <ListView ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}">
        <ListView.ItemTemplate>
            <DataTemplate >
                <Grid d:DataContext="{d:DesignInstance local:User}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="10"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding FirstName}"/>
                    <TextBlock Text="{Binding LastName}" Grid.Column="2"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
public class MyViewModel
{
    private User _selectedUser;

    public MyViewModel()
    {
        Users = new ObservableCollection<User>
        {
            new User{FirstName = "User A FirstName", LastName = "User A LastName"},
            new User{FirstName = "User B FirstName", LastName = "User B LastName"},
            new User{FirstName = "User C FirstName", LastName = "User C LastName"}
        };
    }

    public ObservableCollection<User> Users { get; set; }

    public User SelectedUser
    {
        get { return _selectedUser; }
        set
        {
            _selectedUser = value;
            Debug.WriteLine(_selectedUser.LastName);
        }
    }
}

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MyViewModel();
    }
}