我有一个ListBox数据绑定到Observable Collection of Person的视图。 在同一视图中,我有一个Button。 我想做的是从ListBox中选择一个项目,当我点击按钮时,将所选项目的DataTemplate从“Person”替换为“PersonEdit”。
我看过TemplateSelector,Triggers等,但似乎无法正常工作。
有什么想法吗?
<DataTemplate x:Key="Person">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
<DataTemplate x:Key="PersonEdit">
<TextBox Text="{Binding Path=Name}"/>
</DataTemplate>
<ListBox
x:Name="lbPersons"
Grid.Row="0"
VerticalAlignment="Stretch"
Margin="5"
ItemsSource="{Binding Path=Persons}"
ItemTemplate="{StaticResource ResourceKey=Person}"
>
</ListBox>
<Button
Grid.Row="1"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Content="Add Person" Command="{Binding AddPerson}"/>
答案 0 :(得分:0)
我认为最好的选择是在Person
模型中添加一个属性,告诉用户界面您正在编辑并使用该属性更改Template
以下是我的意思的粗略工作示例,在此示例中,当您将Person
项设置为IsEditing
时,它会将Template
更改为PersonEdit
,否则它将设置Template
Person
的Xaml:
<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));
}
}
}