2015-08-25 4 views
0

Я сделал небольшую программу, где у меня есть все файлы определенной папки и определенного типа в одном списке. Мне нравится изменять имя файла непосредственно внутри ListView.File ListView, изменить имя direct в ListView, WPF C# MVVM

Я создал ListView с текстовыми полями в одном столбце, а имя файла записано внутри текстового поля. Теперь я могу изменить имя в текстовом поле, но не буду менять имя файла. Как сделать это соединение между текстовым полем в ListView и методе, который будет меняться? Да, я здесь немного потерялся. Я довольно свежий в MVVM WPF.

Мой XAML код ListView:

<ListView Name="lvfiles" Grid.Column="0" ItemsSource="{Binding fileslist}" SelectionMode="Single" SelectedItem="{Binding SelectedFiles}" DataContext="{Binding }" Height="140"> 
    <ListView.View> 
     <GridView x:Name="gridFiles"> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
          <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn x:Name="FileName" Header="Name"> 

       <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding FileName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
         </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     <GridViewColumn x:Name="FileCreated" Header="Created" DisplayMemberBinding="{Binding FileCreated}" Width="Auto"/> 
    <GridViewColumn x:Name="FileChanged" Header="Changed" DisplayMemberBinding="{Binding FileChanged}" Width="Auto"/> 
    </GridView> 
</ListView.View> 
</ListView> 

Мои ViewModel является:

public class Files : ViewModelBase 
{ 
    private int fileid; 
    private string filename; 
    private string filecreated; 
    private string filechanged; 

    public string FileName 
    { 
     get { return filename;} 
     set 
     { 
      filename = value; 
      NotifyPropertyChanged("FileName"); 
     } 
    } 

ответ

1

В модели вида:

// you should store file extension somewhere 
private string location; 
private string fileExtension; 

private string _fileName; 
public string FileName 
{ 
    get { return this._fileName; 
    set 
    { 
     if (_fileName != value) 
     { 
      try 
      { 
       var source = Path.Combine(location, _fileName + "." + fileExtension); 
       var destination = Path.Combine(location, value + "." + fileExtension); 

       //if you store your file extension with dot, you should remove the dot from Path.Combine 

       File.Move(source, destination); 
       _fileName = value; 
       // InvokePropertyChanged("FileName"); if needed 
      } 
      catch (Exception E) 
      { 
       MessageBox.Show(E.ToString(), "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
     } 
    } 
} 
+0

я обновить свой текущий ViewModel. Спасибо за твое, я попробую. Я не знал, могу ли я сделать прямо в ViewModel или нет. Но ваш код будет обновлять имя одновременно - в режиме реального времени? Потому что теперь изменится для каждого более позднего ввода (или нет?). Это правда, что я не хочу, чтобы некоторые кнопки подтверждали это, но, может быть, подождите 2 секунды без каких-либо изменений? Или что-то подобное? ... Я пробую ваш код и да его обновление каждое письмо. Можно ли обновить в конце? Да, я знаю, что это намного сложнее? Или нет? – esispaned

+1

Чтобы избежать обновления FileName с каждым измененным символом, измените UpdateSourceTrigger для вашего TextBox на LostFocus в xaml. Теперь это «PropertyChanged» – VMaleev