0

ユーザー コントロールのカスタム依存関係プロパティを 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>

しかし、それを itempaneltemplate として使用すると、バインディングが機能しません:

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

コントロールをパネル テンプレートとして機能させるには、回避策を使用する必要がありますか?それとも、バインドを台無しにしているのですか?

- - 編集

ビューモデルの部分:

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

この Visible ブール値を変更すると、どちらの場合でも機能します。そのため、カスタム DependencyProperty のみの問題のようです。

コントロールの DataContext を ItemsPanelTemplate としてビジュアル ツリーを検査することも正しいです。

itemspaneltemplate として使用された場合ではなく、直接使用された場合に依存関係プロパティが適切に機能するのはなぜですか?

4

1 に答える 1