programing

여러 개의 목록 보기를 뷰 모델에 바인딩하려면 어떻게 해야 합니까?

cafebook 2023. 4. 13. 21:09
반응형

여러 개의 목록 보기를 뷰 모델에 바인딩하려면 어떻게 해야 합니까?

리스트뷰와 그 옆에 있는 버튼을 실장하고 있습니다.리스트 뷰에서 여러 항목을 선택한 후 버튼을 클릭하면 선택한 항목이 리스트에 넣을 수 있어야 합니다.그러나 질문은 선택한 항목을 뷰 모델에 바인딩하려면 어떻게 해야 합니까?선택 모드를 다중 모드로 변경했습니다.그럼 내가 해야 할 일은?

SelectedItem={Binding path= selectedItems}

그리고 내 뷰모델에서 선택한 속성을 만듭니다.아이템, 그러면 내가 선택한 아이템이 설정됩니까?아니면 이를 위한 올바른 솔루션은 무엇일까요?

닥터가 이미 지적한 처럼 Selected를 바인딩할 수 있습니다.XAML 명령 파라미터에 대한 항목

많은 발굴과 검색 끝에, 나는 마침내 이 흔한 문제에 대한 간단한 해결책을 찾았다.

이 기능을 사용하려면 다음 규칙을 모두 따라야 합니다.

  1. Ed Ball의 제안'에 따라 XAML 명령 데이터 바인딩에서 CommandParameter 속성 Before Command 속성을 정의합니다.이것은 매우 시간이 걸리는 버그입니다.

    여기에 이미지 설명 입력

  2. ICommandCanExecute Execute 메서드에 개체 유형의 매개 변수가 있는지 확인하십시오.이렇게 하면 명령 매개 변수 유형이 명령 메서드의 매개 변수 유형과 일치하지 않을 때마다 발생하는 무음 캐스트 예외를 방지할 수 있습니다.

    private bool OnDeleteSelectedItemsCanExecute(object SelectedItems)
    {
        // Your goes here
    }
    
    private bool OnDeleteSelectedItemsExecute(object SelectedItems)
    {
        // Your goes here
    }
    

예를 들어 목록 보기/목록 상자의 선택됨사용자에게 항목 속성 ICommand 메서드 또는 목록 보기/목록 상자 자체입니다.좋아요, 그렇지 않나요?

Selected를 받는 방법을 알아내는 데 많은 시간을 할애하지 않기를 바랍니다.CanExecute 매개 변수로서의 항목.

MVVM에서 이 멀티 셀렉션을 실행하는 것은 좀 까다롭습니다.SelectedItems자산은Dependency Property하지만, 여러분이 사용할 수 있는 몇 가지 요령이 있습니다.블로그 투고에 관한 이 3가지 분류는 이 문제를 상세하게 설명하고 유용한 해결책을 제공하는 것을 발견했다.

도움이 되었으면 좋겠다

시스템을 사용하는 경우.창문들.인터랙티브와 Microsoft.표현.대화는 이미 이루어지고 있습니다.다른 코드/동작에 영향을 주지 않는 회피책을 다음에 나타냅니다.필요한 경우 여기에서 다운로드 할 수 있습니다.

이 회피책에서는 위의 어셈블리에서 인터랙티브이벤트 트리거 및 인터랙션 설정 속성 메커니즘을 사용합니다.

XAML에서의 추가 네임스페이스 선언

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

XAML:

<ListView Name="MyListView" ItemsSource="{Binding ModelList}" DisplayMemberPath="Name"  Grid.Column="0">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
      <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedItems" Value="{Binding Path=SelectedItems, ElementName=MyListView}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</ListView>

모델 표시:

public class ModelListViewModel
{
  public ObservableCollection<Model> ModelList { get; set; }
  public ObservableCollection<Model> SelectedModels { get; set; }

  public ModelListViewModel() {
    ModelList = new ObservableCollection<Model>();
    SelectedModels = new ObservableCollection<Model>();
  }

  public System.Collections.IList SelectedItems {
    get {
      return SelectedModels;
    }
    set {
      SelectedModels.Clear();
      foreach (Model model in value) {
        SelectedModels.Add(model);
      }
    }
  }
}

위의 예에서는 ListView의 선택이 변경될 때마다 ViewModel이 선택한 항목을 선택합니다.

코드 이면에서 Button_Click(...)을 처리할 수 있습니다.그런 다음 listView의 선택한 항목을 반복하여 선택한 항목 목록을 만들 수 있습니다.

View에서 ViewModel에 액세스할 수 있으므로 ViewModel에서 메서드를 호출하여 선택한 항목의 목록을 매개 변수로 전달할 수 있습니다.

바인딩에서만 사용할 수 있을지 모르겠지만 코드 배후에 사용하는 것도 나쁘지 않습니다.

코드 예:

public void Button_Click(object sender, EventArguments arg)
{
  List<ListViewItem> mySelectedItems = new List<ListViewItem>();

  foreach(ListViewItem item in myListView.SelectedItems)
  {
    mySelectedItems.Add(item);
  }

  ViewModel.SomeMethod(mySelectedItems);
}

편집

다음으로 미니멀리즘의 예를 제시하겠습니다.XAML 。

<DataTemplate
            x:Key="CarTemplate"
            DataType="{x:Type Car}">
</DataTemplate>

<ListView x:Name="myListView"
          ItemsSource="{Binding Path=Cars}"
          ItemTemplate="{StaticResource CarTemplate}">
</ListView>

코드 비하인드:

public void Button_Click(object sender, EventArguments arg)
    {
      List<Car> mySelectedItems = new List<Car>();

      foreach(Car item in myListView.SelectedItems)
      {
        mySelectedItems.Add(item);
      }

      ViewModel.SomeMethod(mySelectedItems);
    }

아쉽게도 Selected는항목은 읽기 전용 바인딩할 수 없는 속성입니다.

How to Databind to a Selected라는 기사에서 많은 도움을 받았습니다.WPF의 항목 속성

「 」를 사용하고 Metro/WinRTWinRTXAMLToolkit은 바인딩 가능하기 때문에 참조할 수 있습니다.SelectedItems종속성 속성을 확장 중 하나로 지정합니다.

바인딩할 수는 없지만 명령 매개 변수로 명령으로 보낼 수는 있습니다.

Christian의 투고에 약간의 변형으로 List View를 사용하여 유사한 코드를 구현했습니다.Selection Changed 이벤트.ViewModel에서 메서드를 호출하는 대신 Selected라는 속성을 설정했습니다.항목:

public void ListView_SelectionChanged( object s, SelectionChangedEventArgs e ) {
    List<Car> mySelectedItems = new List<Car>();

    foreach( Car item in myListView.SelectedItems )
        mySelectedItems.Add(item);

    ViewModel.SelectedItems = mySelectedItems;
}

이쪽, View Model.선택된항목은 ViewModel에 있는 모든 명령에 사용할 수 있으며 데이터 바인딩에 사용할 수 있습니다(관찰 가능한 컬렉션으로 변환하는 경우).

난 이 문제를 해결했어, 나한테는 이 문제만으로도 충분했어.

<ListBox ItemsSource="{Binding ListOfModel}" x:Name="ModelList"
                                SelectedItem="{Binding SelectedModel, Mode=TwoWay}">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="SelectionChanged">
                                    <i:InvokeCommandAction Command="{Binding ExecuteListBoxSelectionChange}" CommandParameter="{Binding ElementName=ModelList}">
                                    </i:InvokeCommandAction>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </ListBox>

그런 다음 뷰 모델에서 다음을 수행합니다.

public ICommand ExecuteListBoxSelectionChange { get; private set; }
ExecuteListBoxSelectionChange = DelegatingCommand<ListBox>.For(ListBoxSelectionChnageEvent).AlwaysEnabled();

Selected Models는 선택 항목을 채우는 목록입니다.

    private void ListBoxSelectionChnageEvent(ListBox modelListBox)
    {
        List<ModelInfo> tempModelInfo = new List<ModelInfo>();
         foreach(ModelInfo a in modelListBox.SelectedItems)
             tempModelInfo.Add(a);

         SelectedModels = tempModelInfo;
    }

언급URL : https://stackoverflow.com/questions/5741161/how-to-bind-multiple-selection-of-listview-to-viewmodel

반응형