Frage

Ich arbeite derzeit innerhalb einer WPF -Benutzersteuerung (das Root -Element meiner XAML -Datei ist "userControl"), von dem ich weiß, dass er in einem Fenster gehostet wird. Wie kann ich mit der Datenbindung auf eine Eigenschaft des Fensters zugreifen?

Weiß jemand, warum einfach

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

funktioniert nicht? Die Fehlermeldung, die ich erhalte, lautet:

System.Windows.Data WARNUNG: 4: Quelle für die Bindung mit Referenz 'Relativsource findancestor, Ancestortype =' System.Windows.Window ', Ancestorlevel =' 1 '' nicht finden.

Bearbeiten: Am Ende habe ich eine Variation des Ansatzes von Arsenmkrt verwendet, also habe ich seine Antwort akzeptiert. Ich bin jedoch immer noch daran interessiert, herauszufinden, warum Findancestor nicht "nur" funktioniert ".

War es hilfreich?

Lösung

Der beste Weg ist es, Usercontrol einen Namen zu geben

Erstellen

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

Andere Tipps

Wenn Sie versuchen, aus einem zu entkommen ItemsControl oder DataGridView zu einem kommen Window Sie können diesen Ancestortype von feststellen x:Type Window funktioniert nicht. Oder zumindest nicht ...

Wenn dies der Fall ist, führen Sie wahrscheinlich Blend oder Visual Studio aus und erwarten, dass die Daten zum Entwurfszeit sichtbar sind - was dies nicht tun wird, da VS + Mischung beide ihre eigenen Instanzen erstellen, die nicht wirklich Windows sind. Es wird zur Laufzeit gut funktionieren, aber nicht während des Entwurfsmodus.

Es gibt ein paar Dinge, die Sie tun können:

  • Wickeln Sie in eine Usercontrol ein

  • Hier ist eine alternative Lösung, die ich mir ausgedacht habe. Es hat einen Vorteil, als Sie nicht auf a referenzieren UserControl oder Window Direkt direkt, wenn Sie den übergeordneten Container ändern, wird Ihr Code nicht unterbrochen.

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

Wo DataContextWrapper ist nur ein Netz

namespace MyWPFApplication.Views {
   public class DataContextWrapper : Grid
   {

   }
}

Dann, wenn Sie Bindungen tun, tun Sie dies:

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

Hinweis: Wenn Sie an eine Eigenschaft im Fenster selbst binden möchten, ist es schwieriger und Sie sollten wahrscheinlich über eine Abhängigkeitseigenschaft oder ähnliches binden. Aber wenn Sie MVVM verwenden, ist dies eine Lösung, die ich gefunden habe.

Ich denke, Sie sollten Modus = "EinwaytoSource" wie folgt festlegen:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top