Graeme_Grant
Изменить вас Listbox.ItemTemplate
следующим образом:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid MaxWidth="200" Margin="10">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Image Source="{Binding Url}" />
<TextBlock MouseDown="txtblk_MouseDown" Grid.Row="1"
Text="{Binding Title}" />
<TextBox LostFocus="txtbox_LostFocus" Grid.Row="1"
Text="{Binding Title, Mode=TwoWay}"
Visibility="Collapsed" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
и добавьте следующий код к вашему коду-behind:
private void txtblk_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
TextBox txt = (TextBox)((Grid)((TextBlock)sender).Parent).Children[2];
txt.Visibility = Visibility.Visible;
((TextBlock)sender).Visibility = Visibility.Collapsed;
}
private void txtbox_LostFocus(object sender, RoutedEventArgs e)
{
TextBlock tb = (TextBlock)((Grid)((TextBox)sender).Parent).Children[1];
tb.Visibility = Visibility.Visible;
((TextBox)sender).Visibility = Visibility.Collapsed;
}
Чтобы измененные данные были отражены с помощью привязки данных, необходимо изменить
MyPicture
класс выглядит следующим образом:
public class MyPicture : ObservableBase
{
public Uri Url { get; set; } // filename of image
private string title;
public string Title
{
get { return title; }
set { Set(ref title, value); }
}
}
и добавьте следующий класс для поддержки
INotifyPropertyChanged
интерфейс:
public abstract class ObservableBase : INotifyPropertyChanged
{
public void Set<TValue>(ref TValue field, TValue newValue, [CallerMemberName] string propertyName = "")
{
if (EqualityComparer<TValue>.Default.Equals(field, default(TValue)) || !field.Equals(newValue))
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
То
INotifyPropertyChanged
интерфейс уведомляет систему привязки данных о том, что происходит изменение, когда
PropertyChanged
событие поднято. Я завернул это в базовый класс, сделав использование очень простым. Вы можете увидеть это в свойстве Title
Set
метод проведения
MyPicture
класс.
Чтобы использовать его, нажмите на текст заголовка изображения, и вы сможете его отредактировать. Как только вы нажмете вне текстового поля редактирования, изменения будут применены автоматически.
Suren97
Спасибо Вам большое :) но это просто очень трудно для меня,я хотел более простой вариант, просто написать имя в текстовом поле, а затем после нажатия на кнопку Сохранить,оно будет изменено.Но ничего,это отличная работа, Большое вам спасибо :)
Graeme_Grant
Я отправил вам ответ, однако в моем ответе нет кода. Вместо этого я дал вам две ссылки, которые лучше ответят (чем я могу в контексте этого сайта) на ваш вопрос. Они также ответят на ряд будущих вопросов, которые вы будете иметь с элементом управления ListView, те же самые, которые были у меня, когда я был и все еще использую его.