2016-06-17 10 views
1

私の目的は、チェックボックスのリストボックスでチェックボックスをオンにしたときに、テキストボックスの表示を制御することです。ここでチェックボックスリストwpfでチェックボックスが選択されている場合、テキストボックスの表示を変更するにはどうすればよいですか?

は、私がこれまで

<ListBox ItemsSource="{Binding IssueTypes}" Name="lbModules" VerticalAlignment="Top"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox 
       Content="{Binding IssueName}" 
       x:Name="chkModules" Margin="0,5,0,0" 
       /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

<RichTextBox 
    x:Name="txtIssueDescription" 
    Width="Auto" 
    MinHeight="60" 
    Visibility="{Binding IsChecked, ElementName=chkModules, Converter={StaticResource BooleanToVisibilityConverter}}" 
    > 
</RichTextBox> 
+0

あなたはバッキングプロパティを追加することができますIssueTypesがコレクションであるクラスへのチェックボックスのために? –

+0

IssueTypesはIsueNameのコレクションです – AbinZZ

+0

ここで問題となるのは、 'IssueTypes'に複数の項目がある場合、' chkModules'という名前の複数のCheckBoxがあることです。 – Sidewinder94

答えて

2

を試してみましたが、何である以下のコードを参照してください。

<Window x:Class="ChkList_Learning.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:ChkList_Learning" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BoolToVis"/> 
</Window.Resources> 
<Grid> 
    <StackPanel> 
     <ListBox ItemsSource="{Binding IssueTypes}" Name="lbModules" VerticalAlignment="Top"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <CheckBox Content="{Binding IssueName}" IsChecked="{Binding IsChecked}" x:Name="chkModules" Margin="0,5,0,0" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <RichTextBox x:Name="txtIssueDescription" Width="Auto" MinHeight="60" Visibility="{Binding IsVisible, Converter={StaticResource BoolToVis}}"/> 
    </StackPanel> 
</Grid> 

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.ComponentModel; 
using System.Linq; 
using System.Runtime.CompilerServices; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace ChkList_Learning 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = new ViewModel(); 
     } 
    } 

    class ViewModel:INotifyPropertyChanged 
    { 
     public ObservableCollection<IssueType> IssueTypes { get; set; } 

     public bool IsVisible 
     { 
      get { return IssueTypes.Any(x=>x.IsChecked); } 
     } 

     public ViewModel() 
     { 
      IssueTypes = new ObservableCollection<IssueType>(); 
      IssueTypes.CollectionChanged += IssueTypes_CollectionChanged; 
      for (int i = 0; i < 10; i++) 
      { 
       IssueTypes.Add(new IssueType() { IssueName = "IssueName"+i }); 
      } 
     } 

     private void IssueTypes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { 
      if (e.OldItems != null) 
      { 
       foreach (IssueType item in e.OldItems) 
        item.PropertyChanged -= new 
              PropertyChangedEventHandler(item_PropertyChanged); 
      } 

      if (e.NewItems != null) 
      { 
       foreach (INotifyPropertyChanged item in e.NewItems) 
       { 
        if (item != null) 
        { 
         item.PropertyChanged += 
         new PropertyChangedEventHandler(item_PropertyChanged); 
        } 
       } 

      } 
     } 

     private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      if (e.PropertyName == "IsChecked") 
      { 
       OnPropertyChanged("IsVisible"); 
      } 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    class IssueType:INotifyPropertyChanged 
    { 
     private string issueName; 

     public string IssueName 
     { 
      get { return issueName; } 

      set 
      { 
       issueName = value; 
       OnPropertyChanged(); 
      } 
     } 
     private bool isChecked; 

     public bool IsChecked 
     { 
      get { return isChecked; } 

      set 
      { 
       isChecked = value; 
       OnPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

} 
1

私はIssueTypesのビューモデルクラスになるだろう。私はIssueNameがここの文字列であると仮定しています。背後にあるあなたのコードで

public class IssueType 
{ 
    public string IssueName { get; set; } 
    public bool IsChecked { get; set; } 
} 

次に、あなたのXAMLでイベントがチェックボックスに追加されていることを確認し

private void chkModules_Checked(object sender, RoutedEventArgs e) 
{ 
     IsChecked = IssuesTypes.Any(it => it.IsChecked); 
} 

private bool isChecked; 

public bool IsChecked 
{ 
    get { return isChecked; } 
    set 
    { 
     if (isChecked != value) 
     { 
      isChecked = value; 
      OnPropertyChanged("IsChecked"); 
     } 
    } 
} 

のようなものを持ってみてください。

<ListBox ItemsSource="{Binding IssueTypes}" Name="lbModules" VerticalAlignment="Top"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox 
     Content="{Binding IssueName}" 
     Checked="chkModules_Checked" 
     x:Name="chkModules" Margin="0,5,0,0" 
     /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
関連する問題