Ответы пользователя по тегу C#
  • Как передать значение из одного ViewModel в другой?

    @SitrixEug
    Основная суть MVVM - ViewModel ничего не знает об интерфейсе(View). View же о ViewModel знает. Поэтому создавать конкретную View в обработчике комманды конечно неправильно.
    Но view можно связать с ViewModel в xaml коде, который уже является частью интерфейса, примерно так:
    <DataTemplate DataType="{x:Type vm:TrollViewModel}">
        <v:TrollView />
      </DataTemplate>


    А в обработчике комманды лишь создавать ViewModel. Примерно так:
    protected void ShowWorkspace<T>() where T : WorkspaceViewModel, new()
            {
                WorkspaceViewModel workspace = this.Workspaces.FirstOrDefault(vm => vm is T) as T;
    
                if (workspace == null)
                {
                    workspace = new T();
                    this.Workspaces.Add(workspace);
                }
    
                this.SetActiveWorkspace(workspace);
            }
    
            protected void SetActiveWorkspace(WorkspaceViewModel workspace)
            {
                Debug.Assert(this.Workspaces.Contains(workspace));
    
                ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.Workspaces);
                if (collectionView != null)
                    collectionView.MoveCurrentTo(workspace);
            }


    Подробнее об этом решении в статье автора

    Строчку же можно передать в виде обьекта. ListView у тебя забинжена к какой-то коллекции Collection. Этот самый SomeObject передать в качестве параметра во ViewModel. Главное что-бы он наследовал интерфейс INotifyPropertyChanged.
    Ответ написан
    Комментировать
  • Верстальщик WPF/XAML. Где их искать?

    @SitrixEug
    Сдается мне, что верстальщика именно xaml вы врятли найдете(хотя MS сейчас активно проталкивает xaml в веб, так-что походу они таки появятся), но вам и не нужен именно таковой. Вам подойдет и обычный верстальщик, которому дать освоить Blend. Это совсем не сложно.
    Главное что дизайнить он будет лучше рядового прогера. А blend он освоит.
    Ответ написан
    Комментировать
  • Как правильно дополнить команду Application.Delete, сохранив её базовое выполнение?

    @SitrixEug Автор вопроса
    На текущий момент нашел решение - создать свою отдельную комманду, которая будет делать запрос на удаление, и в случае подтверждения вызывать Application.Delete
    Примерно так:
    public static class GridCommands
    {
      public static readonly  RoutedUICommand Delete = 
        new RoutedUICommand(
          "Удалить строку",
          "DeleteRow",
          typeof (GridCommands),
          new InputGestureCollection(new[] {new KeyGesture(Key.Delete)})
        );
    }
    
    public class DeleteBinding : CommandBinding
    {
      public DeleteBinding()
      {
        Command = GridCommands.Delete;
        CanExecute += DeleteBindingCanExecute;
        Executed += DeleteBindingExecuted;
      }
    
      static void DeleteBindingExecuted(object sender, ExecutedRoutedEventArgs e)
      {
        if (MessageBox.Show("Delete this?", "Delete this?", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
          return;
        ApplicationCommands.Delete.Execute(e.Parameter, (IInputElement)sender);
      }
    
      static void DeleteBindingCanExecute(object sender, CanExecuteRoutedEventArgs e)
      {
        e.CanExecute = ApplicationCommands.Delete.CanExecute(e.Parameter, (IInputElement)sender);
      }
    }
    
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
      </Grid.RowDefinitions>
      <DataGrid
        Name="ItemsGrid"
        ItemsSource="{Binding Items}">
        <DataGrid.Columns>
          <DataGridTextColumn
            Binding="{Binding}"
            Header="N"
            Width="*"
            IsReadOnly="True"/>
        </DataGrid.Columns>
        <DataGrid.CommandBindings>
          <l:DeleteBinding />
        </DataGrid.CommandBindings>
      </DataGrid>
      <Button
        Grid.Row="1"
        Padding="5"
        VerticalAlignment="Center"
        HorizontalAlignment="Center"
        Content="Delete Row"
        Command="{x:Static l:GridCommands.Delete}"
        CommandTarget="{Binding ElementName=ItemsGrid}" />
    </Grid>


    Так-же есть вариант унаследоваться от DataGrid, и там сделать обработчики удаления строк
    Ответ написан
    Комментировать