22

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

なぜ単純に誰かが知っていますか

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

動作しません?私が受け取るエラーメッセージは次のとおりです。

System.Windows.Data警告:4:参照'RelativeSource FindAncestor、AncestorType ='System.Windows.Window'、AncestorLevel='1''でバインドするためのソースが見つかりません。

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

4

4 に答える 4

20

最良の方法は、UserControlに名前を付けることです

このようにUserControlでバインドするよりも、双方向バインディングを使用してUserControlで依存関係プロパティMyPropertyを作成し、メインウィンドウでバインドします。

<UserControl x:Name = "myControl">
     <Label Content={Binding ElementName= myControl, Path=MyProperty}/>
</UserControl>
于 2009-10-28T12:04:39.447 に答える
5

ItemsControlまたはから「エスケープ」しようとしてDataGridViewいるWindow場合は、AncestorTypeofがx:Type Window機能しないことに気付く可能性があります。または、少なくともそうではないようです...

この場合、おそらくBlendまたはVisual Studioを実行していて、設計時にデータが表示されることを期待しています。これは、VS+Blendの両方が実際にはWindowsではない独自のインスタンスを作成するためです。実行時には問題なく動作しますが、デザインモードでは動作しません。

できることがいくつかあります。

  • UserControlでラップする

  • これが私が思いついた代替ソリューションです。UserControlまたはを直接参照していないという利点が1つあります。Windowそのため、親コンテナを変更しても、コードが破損することはありません。

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

DataContextWrapperグリッドはどこにありますか

namespace MyWPFApplication.Views {
   public class DataContextWrapper : Grid
   {

   }
}

次に、バインドするときにこれを行います:

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

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

于 2011-11-16T04:47:58.897 に答える
1

次のようにMode="OneWayToSource"を設定する必要があると思います:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" />
于 2011-04-20T16:32:57.533 に答える
0

ウィンドウのDataContextとしてビューモデルを使用していて、バインドする必要のあるプロパティがそのビューモデルからのものである場合は、パスの前にDataContext.MyPropertyPathを付ける必要があります。

<TextBox Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}}"/>

これは、「祖先ウィンドウを見つけて、MyPropertyのデータコンテキストを調べる」と解釈されます。

于 2020-09-02T20:46:57.963 に答える