转换器在运行时未被调用



我有用户对依赖属性选定项(这是枚举值的集合(的控件

public IEnumerable SelectedItems
{
    get { return (IEnumerable)GetValue(SelectedItemsProperty); }
    set { SetValue(SelectedItemsProperty, value); }
}
public static readonly DependencyProperty SelectedItemsProperty =
    DependencyProperty.Register("SelectedItems", typeof(IEnumerable),
      typeof(UserControl1), new FrameworkPropertyMetadata(OnChangeSelectedItems)
      {
          BindsTwoWayByDefault = true
      });

private static void OnChangeSelectedItems(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var uc = d as UserControl1;
    if (uc != null)
    {
        var oldObservable = e.OldValue as INotifyCollectionChanged;
        var newObservable = e.NewValue as INotifyCollectionChanged;
        if (oldObservable != null)
        {
            oldObservable.CollectionChanged -= uc.SelectedItemsContentChanged;
        }
        if (newObservable != null)
        {
            newObservable.CollectionChanged += uc.SelectedItemsContentChanged;
            uc.UpdateMultiSelectControl();
        }
    }
}
private void SelectedItemsContentChanged(object d, NotifyCollectionChangedEventArgs e)
{
    UpdateMultiSelectControl();
}

我已使用转换器将 selectedItems 依赖项属性与用户控件中的复选框绑定在一起

<ItemsControl ItemsSource="{Binding Items}" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <CheckBox x:Name="ChkBox" Margin="13 0 0 10"  Content="{Binding}" >
                    <CheckBox.IsChecked>
                        <MultiBinding Converter="{StaticResource CheckBoxConverter}"  Mode="TwoWay" >
                            <Binding ElementName="ChkBox" Path="Content" />
                            <Binding  RelativeSource="{RelativeSource FindAncestor,AncestorType={x:Type UserControl}}"  Path="DataContext.SelectedItems" UpdateSourceTrigger="PropertyChanged"  Mode="TwoWay"></Binding>
                        </MultiBinding>
                    </CheckBox.IsChecked>
                </CheckBox>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl> 

和转换器

public class CheckBoxConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType,
           object parameter, System.Globalization.CultureInfo culture)
    {
        if (values != null && values.Length > 1)
        {
            var content = values[0];
            var selected = values[1] as IList;
            if (selected != null && selected.Contains(content))
            {
                return true;
            }
        }
        return false;
    }
    public object[] ConvertBack(object value, Type[] targetTypes,
           object parameter, System.Globalization.CultureInfo culture)
    {
        return new[] { Binding.DoNothing, Binding.DoNothing };
    }
}

我的问题是,如果我在构建时在选定项中添加值,转换器将被调用,但如果我在按钮单击时添加值,它不会被调用。谁能告诉我它发生的原因以及我如何纠正这个问题。

仅当绑定到的任何属性发生更改时,才会调用转换器的 Convert 方法。绑定到CheckBoxContent属性和UserControlSelectedItems属性。当您向集合添加新项时,这些都不会更改。

还尝试绑定到集合的 Count 属性:

<CheckBox x:Name="ChkBox" Margin="13 0 0 10"  Content="{Binding}" >
    <CheckBox.IsChecked>
        <MultiBinding Converter="{StaticResource CheckBoxConverter}"  Mode="TwoWay" >
            <Binding ElementName="ChkBox" Path="Content" />
            <Binding RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}" Path="SelectedItems"/>
            <Binding RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}" Path="SelectedItems.Count"/>
        </MultiBinding>
    </CheckBox.IsChecked>
</CheckBox>

相关内容

  • 没有找到相关文章

最新更新