2016-06-10 13 views
1

Ich habe kein Glück, das Problem der Datenbindung nicht funktioniert. Ich habe zwei Benutzersteuerelemente. Das Benutzersteuerelement, das die Obervablecollection verwendet, funktioniert einwandfrei. Das Benutzersteuerelement, das an ein Objekt gebunden ist, nicht. Wenn ich den Wert dem Text zuweise, erscheint der Wert. Während des Debuggens kann ich überprüfen, ob die Werte korrekt sind.
Diese Logik folgt Paul Sheriff und ein paar Beiträge von dieser Website. Meine Mitarbeiter programmieren nicht in C#, also können sie nicht helfen. Ich vermisse etwas, habe aber keine Ahnung, was es ist.Wint Wpf Databinding

Viewmodel-Klasse, die von INotifyPropertyChanged erbt:

ParameterSettings _ps; 

    public ParameterSettings DetailData 
    { 
     get { return _ps; } 
     set 
     { 
      _ps = value; 
      RaisePropertyChanged("DetailData"); 
     } 
    } 

    public async Task GetParameters() 
    { 
     var pm = new ParameterManager(); 
     DetailData = new ParameterSettings(); 
     await pm.GetLoginCredentials(_ps); 
    } 

Dies ist der Code der Benutzer die Kontrolle.

ViewModels.ParameterSettingsVm _viewModel; 
    public ParameterSettingsUc() 
    { 
     this.InitializeComponent(); 
     _viewModel = (ParameterSettingsVm)Resources["viewModel"]; 
     var bounds = Window.Current.Bounds; 
     this.CancelBtn.Width = bounds.Width * .5; 
     this.SaveBtn.Width = bounds.Width * .5; 
    } 

    private async void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     await _viewModel.GetParameters(); 
     //UserNameBx.Text = _viewModel.DetailData.UserLogin; //textbox gets filled in. 
    } 


<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:SiteManager.Views" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:VM="using:SiteManager.ViewModels" 
    x:Class="SiteManager.Views.ParameterSettingsUc" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400" 
    Loaded="UserControl_Loaded"> 
    <UserControl.Resources> 
     <VM:ParameterSettingsVm x:Key="viewModel"></VM:ParameterSettingsVm> 
    </UserControl.Resources> 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="50"/> 
     </Grid.RowDefinitions> 
     <Grid Grid.Row="0" > 
      <TextBox Header="Login:" VerticalAlignment="Center" Margin="2,10,0,0" Grid.Row="0" x:Name="UserNameBx" Text="{Binding Path=DetailData.UserLogin, Mode=TwoWay, UpdateSourceTrigger=Default}" > 
       <TextBox.DataContext> 
        <VM:ParameterSettingsVm/> 
       </TextBox.DataContext> 
      </TextBox> 
+0

Sie scheinen zwei Instanzen von 'ParameterSettingsVm' zu haben - eine für das Ansichtsmodell Ihres Benutzersteuerelements und eine für den' DataContext' der 'TextBox'. Das könnte Verwirrung stiften. Implementieren 'ParameterSettings' auch' INotifyPropertyChange' und erhöhen die Benachrichtigung über die 'UserLogin'-Eigenschaft? Können Sie mitteilen, wie 'RaisePropertyChanged' implementiert wurde? –

+0

Auch - wenn es eine WinRT-App ist, dann kann es nicht WPF sein. Es ist entweder WPF oder WinRT/XAML = Windows Store App. –

Antwort

0

Ich würde ändern, ist es das ViewModel eine Eigenschaft zu machen.

und dann würde ich _viewModel als Datenkontext für die TextBox festlegen. Ach und setze den dataContext für die usercontrol auf self, so.

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:SiteManager.Views" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:VM="using:SiteManager.ViewModels" 
    x:Class="SiteManager.Views.ParameterSettingsUc" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Loaded="UserControl_Loaded"> 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="50"/> 
     </Grid.RowDefinitions> 
      <Grid Grid.Row="0" > 
       <TextBox Header="Login:" VerticalAlignment="Center" 
Margin="2,10,0,0" Grid.Row="0" x:Name="UserNameBx" 
Text="{Binding Path=DetailData.UserLogin, Mode=TwoWay, UpdateSourceTrigger=Default}" 
    DataContext={Binding _viewModel}> 
       </TextBox> 

Dies ist möglicherweise nicht das, was Sie versuchen, obwohl zu tun. Ich nehme an, seit Sie _viewModel erstellen, möchten Sie es verwenden.

+0

Das hatte ich früher immer wieder mit noch keinem Glück versucht. Es ist, als ob ich etwas Grundlegendes vermisse. Danke für den Versuch. – JenoS

0

Von Microsoft Virtual Academy. Verwendet x: bind es schneller und weniger ausführlich. mva.microsoft.com/de-de/training-courses/windows-10-data-binding-14579. Jede Klasseneigenschaft wurde zu einer INotfiyChange-Eigenschaft der VM gemacht.

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:SiteManager.Views" 
xmlns:VM="using:SiteManager.ViewModels" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:diag="using:System.Diagnostics" 
x:Class="SiteManager.Views.ParameterSettingsUc" 
mc:Ignorable="d" 
d:DesignHeight="300" 
d:DesignWidth="400" 
Loaded="UserControl_Loaded" > 
<UserControl.DataContext> 
    <VM:ParameterSettingsVm></VM:ParameterSettingsVm> 
</UserControl.DataContext> 
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="50"/> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="0" > 
     <Grid.RowDefinitions> 
      <RowDefinition Height="70"/> 
      <RowDefinition Height="70"/> 
      <RowDefinition Height="70"/> 
      <RowDefinition Height="70"/> 
     </Grid.RowDefinitions> 

     <TextBox Header="Login:" VerticalAlignment="Center" Margin="2,10,0,0" Grid.Row="0" x:Name="UserNameBx" Text="{x:Bind Path=_viewModel.UserLogin, Mode=TwoWay }" > </TextBox> 
     <TextBox Header="Password:" VerticalAlignment="Center" Margin="1" Grid.Row="1" x:Name="PasswordBx" Text="{x:Bind Path=_viewModel.UserPassword, Mode=TwoWay }"> </TextBox> 
     <TextBox Header="Mature Key:" VerticalAlignment="Center" Margin="1" Grid.Row="2" x:Name="MatureKeyBx" Text="{x:Bind Path=_viewModel.MatureKey, Mode=TwoWay }"> </TextBox> 


public sealed partial class ParameterSettingsUc : UserControl 
{ 
    ParameterSettingsVm _viewModel { get; set; } = new ParameterSettingsVm(); 


string _userLogin; 
    public string UserLogin 
    { 
     get { return _userLogin; } 
     set 
     { 
      _userLogin = value; 
      RaisePropertyChanged("UserLogin"); 
     } 
    }