2016-07-28 2 views
1

확인란 목록 항목과 제출 버튼이 있습니다. 제출 단추는 처음에 사용 불가능하게해야합니다. 하나의 확인란 선택 또는 여러 선택을 선택하여 버튼을 활성화해야합니다. 아래 코드를 XAML에 추가하고 백엔드 코드에 MVVM을 고수하는 뷰 모델이 있어야합니다.MVVM의 확인란 선택 기준에 따라 WPF 버튼을 활성화하십시오.

XAML ..

<ListBox Grid.Row="1" BorderThickness="0" Background="Transparent" Name="list" ItemsSource="{Binding Items}" Margin="10 5 20 0" SelectionMode="Extended"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <CheckBox Name="check" IsChecked="{Binding IsChecked, Mode=TwoWay}" Margin="5 5 0 10" VerticalAlignment="Center" /> 
           <ContentPresenter Content="{Binding Value}" Margin="5 5 0 10"/> 
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 

<Button Grid.Row="2" Click="Button_Click" HorizontalAlignment="Right" Height="25" Width="60" Margin="0,0,30,0" IsEnabled="{Binding Path=IsButtonEnabled}">     <TextBlock>Submit</TextBlock> </Button> 

그래서보기 모델 OnPropertyChanged를을 사용하여 구현하는 것이 얼마나().

+0

아마도 더 좋은 방법이 있지만 바인딩/멀티 바인드 및 변환기를 사용하지 않는 이유는 무엇입니까? –

+0

그래서 변환기를 사용하여 답변을 추가 할 수 있습니까? – indika

답변

0

뷰 모델에서 각 항목의 모든 PropertyChanged 이벤트에 등록하고 결과를 집계해야합니다. 예를 들어 :

class ViewModel 
{ 
    public ViewModel() 
    { 
     Items = new ObservableCollection<Item>(); 

     PropertyChangedEventHandler propertyChangedHandler = (o, e) => 
     { 
      if (e.PropertyName == nameof(Item.IsChecked)) 
       OnPropertyChanged(nameof(IsButtonEnabled)); 
     }; 

     Items.CollectionChanged += (o, e) => 
     { 
      if (e.OldItems != null) 
       foreach (var item in e.OldItems.OfType<INotifyPropertyChanged>()) 
        item.PropertyChanged -= propertyChangedHandler; 
      if (e.NewItems != null) 
       foreach (var item in e.NewItems.OfType<INotifyPropertyChanged>()) 
        item.PropertyChanged += propertyChangedHandler; 
     }; 
    } 

    public ObservableCollection<Item> Items { get; } 

    public bool IsButtonEnabled => Items.Any(i => i.IsChecked); 
} 

또 다른 옵션은 ReactiveUI를 사용하는 것을 고려한다.

+0

버튼의 xaml은 어떻게되어야합니까? – indika

+0

쓴대로. –

+0

또한 All 대신 All을 사용하도록 코드를 업데이트했습니다. –