我认为最好的选择是向您的Person
模型添加一个属性,以告诉 UI 您正在编辑并使用该属性更改Template
这是我的意思的一个粗略的工作示例,在此示例中,当您将Person
项目设置为IsEditing
它时,它将更改为Template
,PersonEdit
否则它将设置Template
Person
xml:
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="399" Width="464" Name="UI" >
<Window.Resources>
<DataTemplate x:Key="Person">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
<DataTemplate x:Key="PersonEdit">
<TextBox Text="{Binding Name}"/>
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="PersonStyle">
<Setter Property="ContentTemplate" Value="{StaticResource Person}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsEditing}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource PersonEdit}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid DataContext="{Binding ElementName=UI}">
<ListBox Margin="5,5,5,30"
ItemsSource="{Binding Persons}"
SelectedItem="{Binding SelectedPerson}"
ItemContainerStyle="{StaticResource PersonStyle}" />
<Button Margin="5,333,369,5" Content="Add Person" Click="Button_Click" />
</Grid>
</Window>
代码:
public partial class MainWindow : Window
{
private Person _selectedPerson;
private ObservableCollection<Person> _persons = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
Persons.Add(new Person { Name = "Stack" });
Persons.Add(new Person { Name = "Overflow" });
}
public ObservableCollection<Person> Persons
{
get { return _persons; }
set { _persons = value; }
}
public Person SelectedPerson
{
get { return _selectedPerson; }
set { _selectedPerson = value; }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
SelectedPerson.IsEditing = true;
}
}
人物类:
public class Person : INotifyPropertyChanged
{
private string _name;
private bool _isEditing;
public string Name
{
get { return _name; }
set { _name = value; NotifyPropertyChanged("Name"); }
}
public bool IsEditing
{
get { return _isEditing; }
set { _isEditing = value; NotifyPropertyChanged("IsEditing"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}