2016-09-08 4 views
0

の作業はここにここに私のUserControlのXAMLユーザーコントロールは

<UserControl x:Class="UserControlTest.Controls.FullNameControl" 
      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:local="using:UserControlTest.Controls" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      d:DesignHeight="100" 
      d:DesignWidth="100" 
      mc:Ignorable="d"> 

    <Grid> 
     <TextBlock Text="{Binding FirstNameText}" /> 
    </Grid> 
</UserControl> 

は、ここでユーザーコントロール

public sealed partial class FullNameControl : UserControl 
{ 
    public FullNameControl() 
    { 
     this.InitializeComponent(); 
    } 

    public string FirstNameText 
    { 
     get { return (string)GetValue(FirstNameTextProperty); } 
     set { SetValue(FirstNameTextProperty, value); } 
    } 

    public static readonly DependencyProperty FirstNameTextProperty = 
      DependencyProperty.Register("FirstNameText", typeof(string), 
       typeof(FullNameControl), new PropertyMetadata(String.Empty)); 

} 

ための背後にあるコードですではない。ここのUserControl

<Page x:Class="UserControlTest.Views.PageWithUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Behaviors="using:Template10.Behaviors" 
     xmlns:Core="using:Microsoft.Xaml.Interactions.Core" 
     xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
     xmlns:controls="using:Template10.Controls" 
     xmlns:uControls="using:UserControlTest.Controls" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="using:UserControlTest.Views" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:vm="using:UserControlTest.ViewModels" 
     mc:Ignorable="d"> 

    <Page.DataContext> 
     <vm:PageWithUserControlViewModel x:Name="ViewModel" /> 
    </Page.DataContext> 

    <Grid> 
     <uControls:FullNameControl FirstNameText="{Binding FirstName, Mode=OneWay}" /> 
    </Grid> 
</Page> 

を使用するページがされていますビューを生成するビューモデル。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Template10.Common; 
using Template10.Mvvm; 
using Template10.Services.NavigationService; 
using Windows.UI.Xaml.Navigation; 

namespace UserControlTest.ViewModels 
{ 
    public class PageWithUserControlViewModel : ViewModelBase 
    { 
     public PageWithUserControlViewModel() 
     { 
     } 

     private string _FirstName = "Default"; 
     public string FirstName { get { return _FirstName; } set { Set(ref _FirstName, value); } } 

     public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState) 
     { 

      FirstName = "Terrence"; 
      await Task.CompletedTask; 
     } 

     public override async Task OnNavigatedFromAsync(IDictionary<string, object> suspensionState, bool suspending) 
     { 
      await Task.CompletedTask; 
     } 

     public override async Task OnNavigatingFromAsync(NavigatingEventArgs args) 
     { 
      args.Cancel = false; 
      await Task.CompletedTask; 
     } 
    } 
} 
+0

後にユーザーコントロールのコンストラクタに、このDataContextの割り当てコードを追加し、「働いていないユーザーコントロール」についてのあなたの意味は何でしたか? –

+0

データがビューモデルから取り込まれていませんでした。したがって、そのusercontrolを持つすべてのページは、usercontrol内のこれらのフィールドのデータを一度も表示しませんでした。 – Terrence

答えて

-1

ので、不足している部分は、InitializeComponentの呼び出し

public FullNameControl() 
{ 
    this.InitializeComponent(); 
    (this.Content as FrameworkElement).DataContext = this; 
} 
+0

決してこれをしない、それはひどい習慣です。ユーザーコントロールの定義では、x:Nameを要素に追加するだけです。 "WhateverNameThisIs_root"のようなもの。バインディングで、 'ElementName = WhateverNameThisIs_root'を使います。それはあなたがしなければならないすべてのことです。 – Will

+0

1.なぜそれはひどい習慣ですか?一般的に、UCにデータインターフェイスの内容を伝えることは、通常のやり方のようです。 – Terrence

+0

2.私はあなたの提案を試みましたが、データはまだ入力されていません。私はusercontrolまたはx:nameについて知らないviewmodelにバインドしていることを覚えておいてください。私は誤解かもしれない。 – Terrence

関連する問題