>source

MVVM c#를 배우려고 하고 있으며 목록 상자에 이름을 추가하는 간단한 프로그램을 만들려고 했습니다. 이제 목록 상자에서 항목을 눌렀을 때 일부 항목을 삭제하고 다른 명령을 사용하여 "삭제" 버튼을 누르고 싶지만 방법을 찾을 수 없습니다.

뷰 모델은 다음과 같습니다.

public class ViewModel : INotifyPropertyChanged
    {
        private Model _model;
        public ViewModel(Model model)
        {
            AddCommand= new AddNameCommand(this);
         //DeleteCommand= new DeleteNameCommand(this);
            _model= model;
        }
        public string CurrentName
        {
            get { return _model.CurrentName; }
            set
            {
                if (value== _model.CurrentName)
                    return;
                _model.CurrentName= value;
                OnPropertyChanged();
            }
        }
       public event PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged([CallerMemberName] string propertyName= null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        public ObservableCollection<string> AddedNames
        {
            get { return _model.AddedNames; }
        }
        class AddNameCommand : ICommand
        {
            ViewModel parent;
            public AddNameCommand(ViewModel parent)
            {
                this.parent= parent;
                parent.PropertyChanged += delegate { CanExecuteChanged?.Invoke(this, EventArgs.Empty); };
            }
            public event EventHandler CanExecuteChanged;
            public bool CanExecute(object parameter) { return !string.IsNullOrEmpty(parent.CurrentName); }
            public void Execute(object parameter)
            {
                parent.AddedNames.Add(parent.CurrentName);
                parent.CurrentName= null;
            }
        }
        class DeleteNameCommand : ICommand
        {
            public void Execute(object parameter)
            {
                parent.AddedNames.Remove(...?);
            }
        }
        public ICommand AddCommand { get; private set; }
    }
}

보기는

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">    <Grid>        <Grid.ColumnDefinitions>            <ColumnDefinition Width="150"/>            <ColumnDefinition Width="5"/>            <ColumnDefinition Width="*"/>        </Grid.ColumnDefinitions>        <DockPanel>            <TextBlock Text="Added Names"
        DockPanel.Dock="Top" Margin="5,3"/>            <ListBox ItemsSource="{Binding AddedNames}"></ListBox>        </DockPanel>        <GridSplitter Grid.Column="1"
    VerticalAlignment="Stretch" Width="5"
     Background="Gray" HorizontalAlignment="Left" />        <Grid Grid.Column="2">            <Grid.ColumnDefinitions>                <ColumnDefinition Width="Auto"/>                <ColumnDefinition Width="*"/>            </Grid.ColumnDefinitions>            <Grid.RowDefinitions>                <RowDefinition Height="Auto"/>                <RowDefinition Height="Auto"/>                <RowDefinition Height="Auto"/>            </Grid.RowDefinitions>            <TextBlock Grid.Row="0" Text="Name" Margin="5,3"/>            <TextBox Grid.Row="0" Grid.Column="1"   Text="{Binding CurrentName, UpdateSourceTrigger=PropertyChanged}" Margin="5,3"/>            <TextBlock Grid.Row="1" Text="Your name is:" Margin="5,3"/>            <TextBlock Grid.Row="1" Grid.Column="1"  Text="{Binding CurrentName}"  Margin="5,3"/>            <Button Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Left"
         Content="Add Me" Command="{Binding AddCommand}" Margin="5,3" MinWidth="75" />            <Button Grid.Row="2" HorizontalAlignment="Left"
         Content="Delete Me" Command="{Binding DeleteCommand}" Margin="5,29,0,-23" MinWidth="75" />        </Grid>    </Grid></Window>

모델은

public class Model
    {
        public string CurrentName { get; set; }
        public ObservableCollection<string> AddedNames { get; }= new ObservableCollection<string>();
    }

datakontext를 설정하는 방식이 이상합니다. viewmodel 클래스에 새로운 viewmodel 객체를 생성하는 이유는 무엇입니까?

Denis Schaf2022-02-04 01:36:14

@DenisSchaf 그 객체를 내 메인 윈도우 클래스에 추가했습니다. 어느 것이 가장 좋을까요?

Oray2022-02-04 01:36:14

ListBox의 SelectedItem을 삭제 버튼의 CommandParameter에 전달할 수 있습니다. 그러면 항목은 실행 매개변수를 통해 명령에서 사용할 수 있습니다.

Clemens2022-02-04 01:36:14
  • 답변 # 1

    SelectedName 속성이 있거나

    <ListBox ItemsSource="{Binding AddedNames}" SelectedItem="{Binding SelectedName}"/>

    또는 내가 사용하고 싶은 것은 줄에서 삭제하는 것입니다.

    <ItemsControl ItemsSource="{Binding AddedNames}">    <ItemsControl.ItemTemplate>        <DataTemplate>            <DockPanel>                <Button DockPanel.Dock="Right" Content="X" Command="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ItemsControl}}" CommandParameter="{Binding}"/>                <TextBlock Text="{Binding}"/>            </DockPanel>        </DataTemplate>    </ItemsControl.ItemTemplate></ItemsControl>

    그리고

    public void Execute(object parameter)
    {
        parent.AddedNames.Remove((string)parameter);
    }
    

  • 답변 # 2

    추가선택한 이름뷰 모델에 대한 속성:

    public string SelectedName { get; set; }
    

    바인드리스트 박스그것에 대한 관점에서 :

    <ListBox ItemsSource="{Binding AddedNames}" SelectedItem="{Binding SelectedName}" />

    그런 다음 명령에서 속성 값을 사용하기만 하면 됩니다.

    public void Execute(object parameter)
    {
       parent.AddedNames.Remove(parent.SelectedName);
    }
    

    매력처럼 일했습니다! 감사

    Oray2022-02-03 08:37:04
  • 이전 PHP8의 TinyMCE Moxiemanager 관련 문제
  • 다음 python : SageMaker Inference에서 모든 레이블과 점수를 반환하는 방법은 무엇입니까?