2017-07-19 91 views
1

我試圖創建UserControls,以便稍後在WPF應用程序中重用它們。我選擇建立一個小項目來訓練自己,但我無法使其工作。在UserControl的依賴屬性上進行綁定

目標是讓TextBox的內容作爲標籤文本發送,並點擊按鈕。

我對這些鏈接閱讀,並試圖解決方案:

但即使是開始的文字我的設置構造函數不顯示,並點擊按鈕d什麼都沒有。

這裏是我的文件:

MyControl.xaml

<UserControl x:Class="WpfApplication1.MyControl" 
      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:WpfApplication1" 
      mc:Ignorable="d" 
      Name="control" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <TextBox Text="{Binding TextBoxContent,ElementName=control}"/> 
     <Button Content="Print Entry" Grid.Row="1" Command="{Binding ButtonCommmand,ElementName=control}"/> 
     <Label Grid.Row="2" Content="{Binding LabelContent,ElementName=control}"/> 
    </Grid> 
</UserControl> 

MyControl.xaml.cs

using GalaSoft.MvvmLight.CommandWpf; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    public partial class MyControl : UserControl 
    { 
     public MyControl() 
     { 
      InitializeComponent(); 
      ButtonCommmand = new RelayCommand(Action); 
     } 

     public string TextBoxContent 
     { 
      get 
      { 
       return (string)GetValue(TextBoxContentProperty); 
      } 
      set 
      { 
       SetValue(TextBoxContentProperty, value); 
      } 
     } 
     public RelayCommand ButtonCommmand 
     { 
      get 
      { 
       return (RelayCommand)GetValue(ButtonCommandProperty); 
      } 
      set 
      { 
       SetValue(ButtonCommandProperty, value); 
      } 
     } 

     public string LabelContent { 
      get 
      { 
       return (string)GetValue(LabelContentProperty); 
      } 
      set 
      { 
       SetValue(LabelContentProperty, value); 
      } 
     } 

     public void Action() 
     { 
      LabelContent = TextBoxContent; 
     } 

     public static readonly DependencyProperty TextBoxContentProperty = DependencyProperty.Register("TextBoxContent", typeof(string), typeof(MyControl), new PropertyMetadata("")); 

     public static readonly DependencyProperty ButtonCommandProperty = DependencyProperty.Register("ButtonCommmand", typeof(RelayCommand), typeof(MyControl), new PropertyMetadata(null)); 

     public static readonly DependencyProperty LabelContentProperty = DependencyProperty.Register("LabelContent", typeof(string), typeof(MyControl), new PropertyMetadata("")); 
    } 
} 

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" 
     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:WpfApplication1" 
     xmlns:control="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <control:MyControl DataContext="{Binding customControl}" TextBoxContent="{Binding Text,Mode=TwoWay}" LabelContent="{Binding EndText,Mode=TwoWay}" ButtonCommmand="{Binding Command,Mode=TwoWay}"/> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using GalaSoft.MvvmLight.CommandWpf; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Runtime.CompilerServices; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     MyControl customControl = new MyControl(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Command = new RelayCommand(Action); 
      Text = "Testing... Testing... 1, 2, 3,..."; 
     } 

     private string text; 
     public string Text 
     { 
      get 
      { 
       return text; 
      } 
      set 
      { 
       text = value; 
       NotifyPropertyChanged(); 
      } 
     } 
     private string endText; 
     public string EndText 
     { 
      get 
      { 
       return endText; 
      } 
      set 
      { 
       endText = value; 
       NotifyPropertyChanged(); 
      } 
     } 
     private RelayCommand command; 
     public RelayCommand Command 
     { 
      get 
      { 
       return command; 
      } 
      set 
      { 
       command = value; 
       NotifyPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void Action() 
     { 
      EndText = Text; 
     } 

     private void NotifyPropertyChanged([CallerMemberName]string PropertyName = "") 
     { 
      if (!String.IsNullOrEmpty(PropertyName)) 
      { 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName)); 
      } 
     } 
    } 
} 

謝謝你很多關於你的幫助!

+1

在構造函數中設置主窗口的DataContext的本身和從你的XAML中移除DataContext =「{Binding customControl}」:this.DataContext = this; – mm8

+0

哇,就是這樣!非常感謝,我會盡力將其實現到現實中! 你,先生,是救命恩人! –

回答

1

您在窗口的代碼隱藏創建UserControl的另一個實例:

MyControl customControl = new MyControl(); 

你想要做什麼是綁定您在XAML定義到了該UserControl的性質窗戶的屬性。對於這個工作,你應該設置窗口的DataContext本身:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     Command = new RelayCommand(Action); 
     Text = "Testing... Testing... 1, 2, 3,..."; 
    } 
} 

...並從您的XAML刪除此:

DataContext="{Binding customControl}"