2015-07-17 2 views
0

Я могу выяснить, как связать свойство с текстовым полем в коде, но с моим текущим приложением мне нужно привязать свойство из другого класса. Вот упрощенная версия того, что у меня есть:Как связать в xaml с текстовым полем из другого класса

<Window x:Class="Project1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
<Grid> 
    <TextBox x:Name="Textbox1" Text="{Binding Class1.Class2.TextToBind, Mode=TwoWay}" Height="20" Width="75" Background="#FFE5E5E5"/> 
</Grid> 

Codebehind:

namespace Project1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      Class1 = new Class1(); 
     } 
     public Class1 Class1 { get; set; } 
    } 
} 

Class1:

namespace Project1 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      Class2 = new Class2(); 
     } 
     public Class2 Class2 { get; set; } 
    } 
} 

Окончательный класс:

namespace Project1 
{ 
    public class Class2 
    { 
     public Class2() 
     { 
     } 
     private string textToBind; 
     public string TextToBind { get { return textToBind; } set { SetProperty(ref textToBind, value); } } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void SetProperty<T>(ref T field, T value, [CallerMemberName] string name = "") 
     { 
      if (!EqualityComparer<T>.Default.Equals(field, value)) 
      { 
       field = value; 
       var handler = PropertyChanged; 
       if (handler != null) 
       { 
        handler(this, new PropertyChangedEventArgs(name)); 
       } 
      } 
     } 
    } 
} 
+0

Возникли вопросы? Если пример кода делает что-то иное, чем то, что вы хотите, пожалуйста, укажите _спецификацию_. Объясните в деталях, что делает этот код, и как это отличается от того, что вы хотите. Также прочитайте https://stackoverflow.com/help/how-to -ask за советом о том, как представить свой вопрос ясным, ответным путем. –

ответ

1

Вы должны установить DataContext для TextBox или для вашего окна

namespace Project1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      Class1 = new Class1(); 


      Class1.Class2.TextToBind = "Test"; 

      this.DataContext = this; 
     } 
     public Class1 Class1 { get; set; } 
    } 
} 

Кроме того, необходимо, чтобы наследовать Class2 от INotifyPropertyChanged:

public class Class2 : INotifyPropertyChanged 
{ 
    public Class2() 
    { 
    } 
    private string textToBind; 
    public string TextToBind { get { return textToBind; } set { SetProperty(ref textToBind, value); } } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void SetProperty<T>(ref T field, T value, [CallerMemberName] string name = "") 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, value)) 
     { 
      field = value; 
      var handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 
} 
+0

Я все еще ничего не получаю, когда я это делаю. Считаете ли вы, что Class1 необходимо унаследовать от INotifyPropertyChanged, так как изменение класса 2 является изменением свойства Class1? – reubonwry

+0

Я не наследовал Class1 от INotifyPropertyChanged, и это сработало для меня. Я попробую еще раз через 6 часов и поделюсь моим кодом – VMaleev

+0

@Reuben, как я могу отправить тестовый проект, содержащий мой ответ? – VMaleev

0

Если вы хотите связать свой textbox на свойство из класс, кроме DataContext окна, вам необходимо установить его явно


Я попробовал этот код и он работал

<Window x:Class="Project1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     <!-- first add namespace of your project-->  
    xmlns:local="clr-namespace:Project1" 

    Title="Window1" Height="300" Width="300"> 

    <!--second define your data context class as resource--> 
    <Window.Resources > 
     <local:Class2 x:Key="class2"></local:Class2> 
    </Window.Resources> 

    <Grid> 
     <TextBox x:Name="Textbox1" Text="{Binding TextToBind, Mode=TwoWay}" Height="20" Width="75" Background="#FFE5E5E5"> 


      <!--third set the data context of the textbox Explicitly--> 
      <TextBox.DataContext> 
       <StaticResourceExtension ResourceKey="class2"/> 
      </TextBox.DataContext> 
     </TextBox> 
    </Grid> 
</Window> 

Обратите внимание: если вы собираетесь установить свойство TextToBind программно, и вы хотите, чтобы ваш пользовательский интерфейс, чтобы показать результат, вы должны реализовать INotifyPropertyChanged.

+0

После выполнения этих трех вещей я получаю две ошибки. Сначала в MainWindow.g.cs: 'Не удалось найти имя типа или пространства имен 'Class2' (вам не хватает директивы using или ссылки на сборку?)' Второй в MainWindow.xaml: 'Имя" Class2 "не существует в пространстве имен" clr-namespace: Class2 ".' Любые идеи, как их исправить? – reubonwry

+0

1- убедитесь, что ваш класс2 находится в корневом пространстве имен (не в папках .. или вам нужно немного поменять в xaml) 2- Я думаю, если вы решите первый, это исчезнет :) –

+0

My Class2 находится в папке.Я попытался изменить определение для класса datacontext, как это: '', но это не работает. Знаете ли вы, какие конкретные изменения нужно сделать? – reubonwry

Смежные вопросы