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

当在 Mode=TwoWay 的绑定中使用 Converter 时,将触发 ConvertBack 方法。例如,它用于绑定到 TextBox 的 Text 属性。在 TextBox 中显示值时,当值更改时会触发“Convert”方法,当用户更改 TextBox 值时会触发“ConvertBack”。

于 2012-12-29T15:45:51.973 回答
0

UpdateSourceTriggerConvertBack添加到具有函数反向功能的绑定和实现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 回答
0

你正在转换ListBox.ItemsSource,而不是CheckBox.IsChecked

我认为ListBox.ItemsSource甚至不会使用TwoWay绑定,因为默认情况下 ListBoxes 不会更改其 ItemsSource 的源集合。

如果您希望转换器在您更改时运行CheckBox.IsChecked,那么您需要指定要在IsChecked绑定中使用的转换器

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

但在这种情况下,不需要转换器,因为IsChecked它已经是一个布尔值,所以你根本不需要转换它。

如果您试图在CheckBox.IsChecked更改时触发某些内容,则最好确保IsChecked触发通知,并在包含该属性的类的事件中PropertyChange执行代码。PropertyChangedIsChecked

于 2012-12-29T17:03:27.697 回答