簡體   English   中英

在itempaneltemplate上的自定義用戶控件綁定

[英]custom user control binding on itemspaneltemplate

我在將用戶控件上的自定義依賴項屬性綁定到我的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(); }
    }

---- Edit2:我已經進行了進一步的研究,而且更加復雜。 我已經將以下內容添加到ItemsPanelTemplate的控件以及直接在網格中的控件。

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

在這兩種情況下,都可以更改此可見布爾值。 因此,這似乎只是自定義DependencyProperty的問題。

檢查視覺樹作為ItemsPanelTemplate的控件的DataContext也是正確的。

如果直接使用而不是用作itempaneltemplate時,可以使依賴項屬性正常工作的原因是什么?

發現造成奇怪沖突行為的原因。 我在正常ctor中將屬性設置為某個值

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

當將控件用作Itemspaneltemplate時,這顯然引起沖突。 刪除它使綁定按預期方式工作。

我猜想行為上的差異與在不同時間調用構造函數有關嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM