首页 文章

itemspaneltemplate上的自定义用户控件绑定

提问于
浏览
0

我无法将用户控件上的自定义dependencyproperty绑定到我的MVVM ViewModel . 当我直接在我的视图上使用它时,我的用户控件正常工作:

<local:CustomControl Mode="{Binding Mode, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  Grid.Row="0">
        <Button x:Name="InfoBox1" Content="Test1" />
        <Button x:Name="InfoBox2" Content="Test2" />
    </local:CustomControl>

但是使用它作为itemspaneltemplate绑定不起作用:

<ItemsControl Grid.Row="0" ItemsSource="{Binding Equipment}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:CustomControl Mode="{Binding Mode, Mode=TwoWay}"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                ...
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

我已经尝试使用RelativeSource并找到itemscontrol / view并将路径设置为Mode或DataContext.Mode,但我无法使绑定工作 .

模式定义为:

public static readonly DependencyProperty ModeProperty;

    public Modes Mode
    {
        get { return (Modes)this.GetValue(ModeProperty); }
        set { this.SetValue(ModeProperty, value); }
    }

并在自定义控件的构造函数中注册:

public CustomControl()
    {
        Mode = Modes.Default;
    }

    static CustomControl()
    {
        ModeProperty = DependencyProperty.Register("Mode", typeof(Modes), typeof(CustomControl), new FrameworkPropertyMetadata(Mode.Default, OnModeChanged));
    }

    private static void OnModeChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        CustomControl ctrl= o as CustomControl ;
        if (ctrl== null) return;

        Modes mode = (Modes)e.NewValue;
        ctrl.Mode = mode;
    }

我是否需要使用变通方法来使控件作为面板模板工作,或者我只是搞乱绑定太糟糕了?

    • 编辑

viewmodel部分:

private Modes _mode= Modes.Default;
    public Modes Mode
    {
        get { return _mode; }
        set { _mode= value; NotifyPropertyChanged(); }
    }

    private ObservableCollection<EquipmentViewModel> _equipment;
    public ObservableCollection<EquipmentViewModel> Equipment
    {
        get { return _equipment; }
        set { _equipment = value; NotifyPropertyChanged(); }
    }

----编辑2:我进一步调查了,我更复杂了 . 我已经将以下内容添加到ItemsPanelTemplate的控件和直接在网格中的控件 .

Visibility="{Binding Visible, Converter={StaticResource visibilityConverter}}"

在这两种情况下,改变此Visible布尔值都有效 . 所以它似乎只是自定义DependencyProperty的一个问题 .

检查可视树,控件的DataContext作为ItemsPanelTemplate也是正确的 .

什么可以使依赖属性在直接使用时正常工作,而不是在用作itemspaneltemplate时?

1 回答

  • 0

    发现导致奇怪冲突行为的原因 . 我在正常的ctor中将属性设置为某个值

    public CustomControl()
    {
        Mode = Modes.Default;
    }
    

    当将控件用作Itemspaneltemplate时,这显然会导致冲突 . 删除它使绑定按预期工作 .

    我猜行为的不同与在不同时间对构造函数的调用有关?

相关问题