Winrt Wpf databinding

时间:2016-06-10 16:15:06

标签: c# wpf data-binding windows-runtime winrt-async

I am having no luck finding the issue of data binding not working. I have two user controls. The user control that uses the obervablecollection works fine. The user control bound to an object doesnt. If i assign the value to the text the value does appear. During debugging I can verify that the values are correct.
This logic is following Paul Sheriff and a few posts from this web site. My coworkers dont program in C# so they cant help. Im missing something but have no idea what it is.

ViewModel class that inherits from INotifyPropertyChanged:

    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); 
    }

this is the code the user control.

    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>

2 个答案:

答案 0 :(得分:0)

我会改变它是使ViewModel成为一个属性。

ViewModels.ParameterSettingsVm _viewModel {get;set;}
    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.
    }

然后我将_viewModel设置为textBox的数据上下文。哦,并将usercontrol的dataContext设置为self,就像这样。

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

这可能不是你想要做的。我只是假设你正在创建_viewModel,你会想要使用它。

答案 1 :(得分:0)

来自微软虚拟学院。使用x:绑定它更快,更简洁。   mva.microsoft.com/en-US/training-courses/windows-10-data-binding-14579。每个类属性我都是vm的INotfiyChange属性。

  <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");
        }
    }