0

次のアイテムデータクラスとコンバーターがあります。

class ListBoxViewItem
{
    public String Name { get; set; }
    public Boolean IsChecked { get; set; }
}

[ValueConversion(typeof(List<String>),typeof(List<ListBoxViewItem>))]
class ListToItemConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return null;
        IEnumerable<String> l = value as IEnumerable<String>;
        return (from n in l select new ListBoxViewItem() { IsChecked = true, Name = n });
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

class ListBoxData
{
    public List<String> AllData
    {
        get
        {
            return new List<string>()
            {
                "FOO",
                "BAR"
            };
        }
        set
        {

        }
    }
}

ListBoxDataのインスタンスをリストボックスコントロールのにバインドしますItemsSource。以下のように:

    <ListBox>
        <ListBox.ItemsSource>
            <Binding>
                <Binding.Path>AllData</Binding.Path>
                <Binding.Converter>
                    <local:ListToItemConverter />
                </Binding.Converter>
                <Binding.Mode>TwoWay</Binding.Mode>
            </Binding>
        </ListBox.ItemsSource>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay}"
                          Content="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

だから私の質問は、Convertリストボックスが表示されているときに関数が呼び出されるということですが、このリストボックスのすべての項目はチェックボックスであるため、TwoWayバインディングを使用してインスタンスとリストボックスをバインドしますがConvertBack、のチェックボックスをオン/オフにすると呼び出されませんこのリストボックス。

ConvertBack期待どおりに動作するように設計されているかどうかはわかりません。ConvertBackしかし、チェックステータスが変更されたときにをトリガーできるようにしたい場合はどうすればよいですか?

4

3 に答える 3

1

ConvertBackメソッドは、コンバーターがMode=TwoWayのバインディングで使用されている場合に起動します。例は、TextBoxのTextプロパティへのバインディングで使用される場合です。「Convert」メソッドは、TextBoxに値を表示するときに値が変更されたときに発生し、「ConvertBack」は、ユーザーがTextBoxの値を変更したときに発生します。

于 2012-12-29T15:45:51.973 に答える
0

を変換していますが、変換ListBox.ItemsSourceしていませんCheckBox.IsChecked

デフォルトでは、ListBoxes は ItemsSource のソース コレクションを変更しないためListBox.ItemsSource、バインディングを使用しても機能しないと思います。TwoWay

を変更したときにコンバーターを実行する場合は、バインディングCheckBox.IsCheckedで使用するコンバーターを指定する必要があります。IsChecked

<CheckBox IsChecked="{Binding IsChecked, 
                              Converter={StaticResource MyCheckboxConverter}}"
          Content="{Binding Name}"/>

ただし、この場合、IsCheckedはすでにブール値であるため、コンバーターは必要ないため、変換する必要はまったくありません。

変更時に何かをトリガーしようとしている場合はCheckBox.IsChecked、確実に通知をIsCheckedトリガーし、プロパティを含むクラスのイベントでコードを実行することをお勧めします。PropertyChangePropertyChangedIsChecked

于 2012-12-29T17:03:27.697 に答える
0

UpdateSourceTriggerを Bindingに追加しConvertBack、関数の逆の機能を持つ関数を実装しConvertます。

次の変更

<CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay}">

 <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">

ConvertBack関数は次のとおりです

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (value is IEnumerable<ListBoxViewItem>) 
    {
      var l = (IEnumerable<ListBoxViewItem>)value;
      return l.Select(l.IsChecked);
    }

   return null;
}
于 2012-12-29T15:17:56.603 に答える