如何将xaml绑定到来自不同类的文本框

时间:2015-07-17 20:57:38

标签: c# wpf xaml data-binding

我可以弄清楚如何将属性绑定到代码隐藏中的文本框,但是对于我当前的应用程序,我需要绑定到不同类的属性。这是我所拥有的简化版本:

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

代码隐藏:

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

2 个答案:

答案 0 :(得分:1)

您必须为TextBox或Window

设置DataContext
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; }
    }
}

此外,您还需要从INotifyPropertyChanged继承Class2:

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

答案 1 :(得分: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