c# - 转换器在运行时没有被调用

标签 c# wpf ivalueconverter multibinding

我有带有依赖属性所选项目的用户控件(这是枚举值的集合)

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 依赖属性与用户控件中的复选框绑定(bind)在一起

<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 };
    }
}

我的问题是,如果我在构建时在所选项目中添加值,转换器就会被调用,但如果我在单击按钮上添加值,它不会被调用。任何人都可以告诉我发生这种情况的原因以及如何进行操作吗?可以纠正这个问题。

最佳答案

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

尝试绑定(bind)到集合的 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>

关于c# - 转换器在运行时没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225642/

相关文章:

c# - 在比较一个属性时检查列表是否包含所有其他列表项

C#添加引用问题

c# - 为什么 MouseMove 不会在自定义 FrameworkElement 上触发?

c# - ValueConversionAttribute 类的重点是什么?

c# - 如何通知哈希集的第一个元素的更改?

c# - WPF代码分析: CA2202 Do not dispose objects multiple timesObject

c# - 在 asp.net webforms 上创建单个异步 webmethod 以进行长轮询

wpf - Fluent-Nibernate 以 wpf : Convention to use uNhAddIns. ..ObservableListType<T> 作为默认值?

c# - 当 TextBox 插入符号更改时,是否有机会引发事件?