8

Wpf アプリケーションには、メイン ウィンドウがあります。同じプロジェクトにユーザー コントロールを追加しました。ユーザー コントロールの .xaml.cs ファイルに、Dependency プロパティ (プロパティの "Value" 名) が追加されます。

usercontrol.xaml で定義された依存関係プロパティにアクセスしたいと思います。window.xaml またはその他のユーザー コントロールでコントロール インスタンスを作成するときに、同じことができることはわかっています。

しかし、.xaml の .xaml.cs で定義された依存関係プロパティにアクセスすることは可能ですか?

Vivs の回答に基づいて更新された質問

Ok。私は自分の質問に間違って言及しました。とはいえ、私もアクセスに気づいていませんでした。しかし、私の実際の意図した質問は、.xaml から依存関係プロパティを設定できるということです。上記の例のようなもの、

<Grid CustomBackground ="{Binding Path= BackgroundColor}" />

または

<Grid CustomBackground ="Blue" />

同じ .xaml でこのようなカスタム依存関係プロパティを設定することは可能ですか?

4

1 に答える 1

11

はい、可能です。

何かのようなもの:

.xaml

<UserControl x:Class="MvvmLight26.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:MvvmLight26"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d">
  <Grid Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:UserControl1}}, Path=CustomBackground}" />
</UserControl>

および.xaml.cs :

public partial class UserControl1 : UserControl {
  public static readonly DependencyProperty CustomBackgroundProperty =
    DependencyProperty.Register(
      "CustomBackground",
      typeof(Brush),
      typeof(UserControl1),
      new FrameworkPropertyMetadata(Brushes.Tomato));

  public UserControl1() {
    InitializeComponent();
  }

  public Brush CustomBackground {
    get {
      return (Brush)GetValue(CustomBackgroundProperty);
    }
    set {
      SetValue(CustomBackgroundProperty, value);
    }
  }
}

代わりの:

as 自体の を次のように指定するDataContextと、次のようになります。UserControl

public UserControl1() {
  InitializeComponent();
  DataContext = this;
}

次に、xamlで次のようにします:

<Grid Background="{Binding Path=DataContext.CustomBackground}" />

アップデート:

新しい質問については、

直接的ではない。

  • カスタム DP が添付プロパティとして登録されている場合は、値を "設定" できます (添付プロパティは、その動作とスコープにおいて通常の DP と同じではないことに注意してください)。
  • 通常のDPとして保持したい場合はUserControl1、元の回答と同じままにすることができます(DP部分のみです。xaml部分を削除し、コードで非部分クラスにする必要があります-後ろ)、それを新しい に派生させUserControlます。

何かのようなもの:

<local:UserControl1 x:Class="MvvmLight26.UserControl2"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:local="clr-namespace:MvvmLight26"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    CustomBackground="Blue"
                    mc:Ignorable="d">
  <Grid />
</local:UserControl1>

UserControl1「BaseUserControl」などの名前を付けて、直接使用するためのものではないことを明確にすることができます。

  • UserControl.Style同じ xamlから値を設定することもできます。

xaml:

<UserControl x:Class="MvvmLight26.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:MvvmLight26"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d">
  <UserControl.Style>
    <Style>
      <Setter Property="local:UserControl1.CustomBackground"
              Value="Blue" />
    </Style>
  </UserControl.Style>
  <Grid Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:UserControl1}}, Path=CustomBackground}" />
</UserControl>
于 2013-07-04T12:03:03.493 に答える