2017-04-26 136 views
0

我是Xaml和綁定概念的新手。如何將MainClass的'CustomerName'屬性與XAML中'TextBox1'的文本內容綁定?如何將文本框文本與其他類屬性綁定?

這裏是我的MainClass,

namespace TextBinding.Module 
{ 
    public class MainClass 
    { 
     public string CustomerName { get; set; } 
    } 

} 

我的XAML代碼是,

<UserControl x:Class="TextBinding.Design.ControlDesigner" 
     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:TestControl="clr-namespace:TextBinding.Module" 
     mc:Ignorable="d" d:DesignHeight="1000" d:DesignWidth="1000"> 

    <TestControl:MainClass x:Key="Test1" /> 
    <Grid> 
     <TextBox x:Name="TextBox1" Height="50" Text="{Binding Test1.CustomerName, Mode=TwoWay}" /> 
    </Grid> 
</UserControl> 

這上面的方法是行不通的。任何人都可以提出更好的綁定方式嗎?提前致謝。

+0

看到https://msdn.microsoft.com/en -us/library/system.componentmodel.inotifypropertychanged(v = vs.110).aspx –

+1

_「根本不工作」_ - 堆棧溢出問題預計會有比這更精確的問題陳述。也就是說,你發佈的代碼看起來並不合理;它令人困惑,爲什麼你認爲這應該工作。請閱讀文檔,並按照其中的一些示例進行操作。如果這不能解決你的誤解,請查看網上的各種教程,甚至是Stack Overflow中的數據綁定問題,以獲得更多有用的示例,這些示例將告訴你正確的方法。在發佈更多問題之前,請閱讀[mcve]和[問]。 –

+0

就上述情況而言,您的'MainClass'對象不應該是UserControl的子對象,也不應該是資源。因爲它是一個'UserControl',所以你想避免將它作爲'UserControl'本身的'DataContext',但是你可以將它設置爲'DataContext'。 'UserControl'中的'Grid'。然後你可以綁定到'CustomerName'而不是'Test1.CustomerName',它應該可以工作。 –

回答

0
<UserControl x:Class="TextBinding.Design.ControlDesigner" 
      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:TestControl="clr-namespace:TextBinding.Module" 
      mc:Ignorable="d" d:DesignHeight="1000" d:DesignWidth="1000"> 
    <UserControl.Resources> 
      <TestControl:MainClass x:Key="Test1" /> 
     </UserControl.Resources> 

     <Grid> 
      <TextBox x:Name="TextBox1" Height="50" Text="{Binding CustomerName, Mode=TwoWay}" 
DataContext="{DynamicResource Test1}" /> 
     </Grid> 
    </UserControl> 

您需要在usercontrol資源部分中定義類對象。您還需要在文本框的DataContext屬性中指定該類對象。

0

這不是一個好主意,你應該嘗試使用MVVM並有單獨的視圖,View Model來做這種東西。

但低於你的問題的答案:

public partial class ControlDesigner: UserControl 
    { 

     public string CustomerName { get; set; } 

    public MainWindow() 
    { 
     // Set Value 
     // CustomerName = "Test Name"; 
     InitializeComponent(); 
     this.DataContext = this; 
    } 
} 

下面是問題樣品MVVM方法:

創建新的WPF應用程序,並按照步驟:

  1. 有一個Mainwindow.xaml,它將包含用戶控件。

    <Grid> 
        <local:ControlDesigner Grid.Row="1" /> 
    </Grid> 
    
  2. 創建一個視圖模型和用戶主窗口的DataContext的設置爲ViwModel。

     public class MainWindowViewModel   
         { 
          private string _customeName; 
    
          public string CustomerName 
          { 
           get { return _customeName; } 
           set { _customeName = value; } 
          } 
    
    
         } 
    
         public partial class MainWindow : Window 
         { 
    
    
          public MainWindow() 
          { 
           InitializeComponent(); 
           this.DataContext = new MainWindowViewModel(); 
          } 
         } 
        } 
    
  3. 綁定正文塊,以查看父窗口的模型:

    TextBlock的文本= 「{結合客戶名稱}」>

+1

你不應該明確地設置UserControl的DataContext,既不是自己也不是爲某些視圖模型實例。這樣做可以有效地防止UserControl從其父控件或窗口繼承DataContext,並且通常會中斷綁定到控件的依賴項屬性。見例如這裏:http://stackoverflow.com/a/28982771/1136211。 – Clemens

+0

@Clemens,同意,我會牢記這一點。但是會保持這個答案是開放的,因爲OP不知道View和View-Model之間是如何發生的,或者在這種情況下甚至不支持代碼。 – Simsons

+0

如果你認真回答這個問題,你應該展示一個合適的MVVM方法和一個視圖模型使用UserControl的Window的DataContext中的實例。 – Clemens

相關問題