C# 使用数据模板从ListView中的Selecteditem获取样式
我试图从ListView中获取数据,但在获取来自DataTemplate的数据时遇到问题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时,我不能使用
//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();
}
}