2009-10-28 4 views
22

私はウィンドウ内でホストされている知っている、(私のXAMLファイルのルート要素は、「ユーザーコントロール」です)。データバインディングを使用してWindowのプロパティにアクセスするにはどうすればよいですか?単に をするのでしょうか?私は現在、WPFユーザーコントロール内に働いています

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." /> 

が動作しない

理由

は誰でも知っていますか?私が受け取るエラーメッセージは次のとおりです。

System.Windows.Data警告:4:参照 'RelativeSource FindAncestor、AncestorType =' System.Windows.Window '、AncestorLevel =' 1 'でバインディングのソースを見つけることができません。

編集:私はArsenMkrtのアプローチのバリエーションを使用したので、彼の答えを受け入れました。しかし、私はFindAncestorは「ただ働き」しない理由を見つけることにまだ興味があります。

+2

あなたは彼の答えが異なれば、実際に何を投稿することができますか? – Miles

+0

MVVMパターンのコンテキストでこの問題の解決策を探していたことに注意してください。私がバインドしたいウィンドウのプロパティは、実際にはウィンドウのViewModelのプロパティでした。 – user200783

+1

ArsenMkrtは、UserControlにプロパティを作成してバインドし、次にこれを(XAMLでは)このプロパティをWindowの望ましいプロパティにバインドすることを提案しました。しかし、MVVMパターンでは、UserControlはXAMLには登場しなかったので、2番目の部分は不可能でした。 – user200783

答えて

15

最良の方法は、私が考えるこの

<UserControl x:Name = "myControl"> 
    <Label Content={Binding ElementName= myControl, Path=MyProperty}/> 
</UserControl> 
+0

しかし、私は、UserControlではなく、別のXAMLファイルで定義されているウィンドウを含むウィンドウのプロパティにバインドします。 – user200783

+0

userControlにプロパティを持ち、そのプロパティをwindowプロパティでバインドする方が良いでしょう。 –

+2

UserControlで依存関係プロパティを作成できますか?ウィンドウにusercontrolを追加しないでください。

0

のように、ユーザーコントロールにバインドするよりも、ユーザーコントロール

2ウェイバインディングでのUserControlで依存関係プロパティのMYPROPERTYを作成し、メインウィンドウでそれをバインドするに名前を与えることですあなたがItemsControlかから「脱出」にしようとしている場合は

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" /> 
4

:あなたはこのような=「OneWayToSource」モードを設定する必要がありますあなたがx:Type WindowのAncestorTypeが動作しないことを発見することができるWindowに取得する10。それはVSの+の両方をブレンドしませんので、どの - これはおそらくブレンドまたはVisual Studioを実行し、設計時に見えるようにデータを期待しているケースがある場合、または少なくとも...に

をいないようです実際にはWindowsではない独自のインスタンスを作成します。実行時にうまく動作しますが、デザインモードでは動作しません。

あなたがすることができるカップルの事があります:ユーザーコントロール

    • ラップは、ここで私が作ってみた代替ソリューションです。それはあなたのコードが中断されません親コンテナを変更するので、もしあなたが、直接UserControlまたはWindowを参照していないという点で、一つの利点があります。あなたがにバインドしたい場合:

      <TextBlock Text="{Binding="{Binding DataContext.SomeText, 
          RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper}, 
          Mode=FindAncestor}}" /> 
      

      注:あなたはこれを行うバインドするときDataContextWrapperは、それからちょうどグリッド

      namespace MyWPFApplication.Views { 
          public class DataContextWrapper : Grid 
          { 
      
          } 
      } 
      

      ある

      <Window 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:views="clr-namespace:MyWPFApplication.Views" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
      x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow" 
      mc:Ignorable="d" 
      x:Name="LayoutRoot" 
      Title="UPCLabelPrinterWindow"> 
      
      <views:DataContextWrapper> 
          <DockPanel> 
           ... 
          </DockPanel> 
      </views:DataContextWrapper> 
      

    ウィンドウ自体のプロパティそれはトリッキーですおそらく依存関係プロパティなどを介してバインドする必要があります。しかし、あなたがMVVMを使用している場合、これは私が見つけた一つの解決策です。

  • +0

    私の場合 'AncestorType = {x:Type Window}'はかなり役に立ちました。なぜなら 'AncestorType = UserControl'は何とか私のウィンドウを指していなかったからです。 – LuckyLikey

    関連する問題