单击按钮更改选定的ListBox项DataTemplate

时间:2013-03-01 00:39:48

标签: c# wpf xaml mvvm

我有一个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}"/>

1 个答案:

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