Как получить до редактирования и после редактирования текстового поля? - PullRequest
0 голосов
/ 12 апреля 2019

Я использую PRISM MVVM для отображения списка файлов, содержащих изображение, имя файла и размер изображения.

Пользователь должен иметь возможность изменить имя файла, введя новое имя. При выходе из текстового поля имя файла в моей ViewModel должно быть переименовано. Для этого мне, конечно, нужно знать текст таким, каким он был до и после.

Я не хочу использовать код позади, но я думаю, мне нужно работать с GotFocus, чтобы сохранить значение до и в LostFocus, чтобы получить новое значение. Правильно?

Это мой XAML

  <Grid>   
    <ListView x:Name="MiscFilesListView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding MiscFiles}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <UniformGrid Columns="1" HorizontalAlignment="Stretch"/>
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
      <ListView.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Vertical" VerticalAlignment="Top" HorizontalAlignment="Stretch">
            <Image Source="{Binding ImageData}" HorizontalAlignment="Center" VerticalAlignment="Top" Height="100" Width="100" />
            <TextBox Text="{Binding FileName}" HorizontalAlignment="Center" VerticalAlignment="Bottom" />
            <TextBlock Text="{Binding Size}" HorizontalAlignment="Center" VerticalAlignment="Bottom" />
          </StackPanel>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>
  </Grid>

Listview связан с:

public ObservableCollection<MiscFile> MiscFiles
{
   get => _miscFiles;
   set => SetProperty(ref _miscFiles, value);
}

Модель представления

  public class MiscFile : INotifyPropertyChanged
  {
    public BitmapImage ImageData { get; set; }
    public string FileName { get; set; }
    public string FullFileName { get; set; }
    public string Size { get; set; }

    public void OnPropertyChanged(string propertyname)
    {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
    }

    public event PropertyChangedEventHandler PropertyChanged;
  }

Есть идеи, как мне этого добиться внутри Viewmodel? Нужен ли какой-нибудь EventTrigger?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Вы можете создать личное поле для имени файла в модели представления.Открытое свойство FileName должно проверять, отличается ли значение от значения, заданного в приватном поле.Также уведомите INotifyPropertyChanged, вызвав OnPropertyChanged.Это должно обновить свойство имени файла.

Если вы хотите сохранить старое имя файла, можно вызвать метод Path.GetFileName(FullFileName) статического класса Path.

private string _filename;
public BitmapImage ImageData
{
    get;set;
}

public string FileName
{
    get
    {
        return _filename;
    }
    set
    {
        if (_filename != value)
        {
            _filename = value;
            OnPropertyChanged(nameof(FileName));
        }
    }
}
0 голосов
/ 12 апреля 2019

Предыдущее значение уже сохранено в вашем MiscFile объекте.Просто определите вспомогательное поле для вашего свойства:

private string _filename;
public string FileName
{
    get { return _filename; }
    set
    {
        string oldValue = _filename;
        string newValue = value;

        //update...
        _filename = value;
    }
}

Это должно работать, так как свойство источника не должно устанавливаться до тех пор, пока TextBox не потеряет фокус, поскольку вы не изменили свойство UpdateSourceTrigger объектапривязка от значения по умолчанию LostFocus:

<TextBox Text="{Binding FileName, UpdateSourceTrigger=LostFocus}" ... />
...