自定义用户控件绑定在ItemSpaneltemplate上



我很难绑定在mvvm ViewModel上的UserControl上的自定义依赖关系。当我直接在视图上使用它时,我的用户控件正常工作:

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

我已经尝试使用亲属库并查找itemscontrol/view,并设置了通往模式或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}}"

在两种情况下,更改这种可见布尔值都可以。因此,它似乎只是自定义依赖性property的问题。

检查视觉树以itemspaneltemplate的数据添加数据的数据附件也正确。

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

找到了导致奇怪冲突行为的原因。我将属性设置为普通CTOR

中的一定值
public CustomControl()
{
    Mode = Modes.Default;
}

这似乎是在使用控件用作项目的Spaneltemplate时引起的冲突。删除此功能使绑定工作如预期的。

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

相关内容

  • 没有找到相关文章

最新更新