• Как передать значение из одного 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, и там сделать обработчики удаления строк
    Ответ написан
    Комментировать
  • Почему не биндятся данные к combobox в WPF DataGrid?

    @SitrixEug Автор вопроса
    Датаконтекстом действительно оказался конкретный объект Conductor.
    Вариант со статическим объектом мне не понравился. RelativeSource сначала не находил DataGrid. Что-бы через RelativeSource найти DataGrid, пришлось сделать следующим образом:

    <DataGridComboBoxColumn Header="Колонна" Width="auto" SelectedValueBinding="{Binding Brigade}" DisplayMemberPath="Brigade1">
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Brigades}"/>
                                <Setter Property="IsReadOnly" Value="True"/>
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
                        <DataGridComboBoxColumn.EditingElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Brigades}"/>
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>
    Ответ написан
    Комментировать