2016-07-28 88 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

我也剛剛更新了代碼,使用Any而不是All。 –

相關問題