2017-05-23 5 views
2

es einfach zu machen, habe ich die folgenden Benutzersteuerung gemacht:
XAML:Ärger Bindung Benutzersteuer Ansicht Modelleigenschaft

<UserControl x:Class="Ex2.testUC" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Ex2" 
      x:Name="testuc" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel> 
     <TextBox Text="{Binding Path=MyText, ElementName=testuc}" /> 
    </StackPanel> 
</UserControl> 

CS.XAML:

using System.Windows; 
using System.Windows.Controls; 

namespace Ex2 
{ 
    public partial class testUC : UserControl 
    { 
     public testUC() 
     { 
      InitializeComponent(); 
     } 
     public string MyText 
     { 
      get { return (string)GetValue(MyTextProperty); } 
      set { SetValue(MyTextProperty, value); } 
     } 
     public static readonly DependencyProperty MyTextProperty = 
      DependencyProperty.Register("MyText", typeof(string), typeof(testUC)); 
    } 
} 

Now I habe ihn in eine Ansicht mit einer einfachen Ansicht eingefügt Modell:
XAML:

<Window x:Class="Ex2.testWindow" 
     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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Ex2" 
     xmlns:control="clr-namespace:Ex2" 
     mc:Ignorable="d" 
     Title="testWindow" Height="300" Width="300"> 
    <StackPanel> 
     <control:testUC MyText="{Binding Path=Text}"/> 
     <Button Height="100" Click="Button_Click" Content="CLICK HERE"/> 
     <Label x:Name="lbl" Height="50"/> 
    </StackPanel> 
</Window> 

XAML.CS:

using System.Windows; 

namespace Ex2 
{ 
    public partial class testWindow : Window 
    { 
     private testVMText vm; 
     public testWindow() 
     { 
      InitializeComponent(); 
      vm = new testVMText(); 
      DataContext = vm; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      lbl.Content = vm.Text; 
     } 
    } 
} 

Ansicht Modell:

using System.ComponentModel; 

namespace Ex2 
{ 
    class testVMText : INotifyPropertyChanged 
    { 
     public string Text { get; set; } 
     public testVMText() 
     { 
      Text = "default"; 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 
} 

Wenn ich auf die Schaltfläche klicken, ich den Wert des Textes im Ansichtsmodell gedruckt werden soll. Meine Absicht war, das Textfeld des Benutzersteuertextes an die Eigenschaft Text im Ansichtsmodell zu binden. Wenn ich jedoch den Text im Textfeld ändere und auf die Schaltfläche klicke, wird immer der String "default" gedruckt.
Was mache ich hier falsch?

Antwort

2

den Modus des Binding Set zu TwoWay:

<local:testUC MyText="{Binding Path=Text, Mode=TwoWay}"/> 

Sie auch die BindsTwoWayByDefault Eigenschaft auf true gesetzt könnte, wenn Sie die Abhängigkeitseigenschaft in Ihrem testUC Klasse registrieren:

public static readonly DependencyProperty MyTextProperty = 
     DependencyProperty.Register("MyText", typeof(string), typeof(testUC), new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true }); 
Verwandte Themen