将复选框元素绑定到contentpresenter内的元素

时间:2012-08-17 19:00:06

标签: wpf xaml

我可以将一个复选框重新绑定到xaml中的另一个elemtn,就像

一样
<CheckBox IsChecked="{Binding ElementName=textEditor,Path=WordWrap}">
<TextEditor Grid.Row="1"
            Name="textEditor"
            FontFamily="Consolas"
            FontSize="10pt"
            SyntaxHighlighting="JavaScript">

    </TextEditor>

它工作得很好,但出于某种原因,我想在c#代码intead中创建texteditor并将其放在contentpresenter中,但在此之后绑定不能像我期望的那样工作。

 <ContentPresenter Name="CpTextEditor" Grid.Row="1" Content="{Binding TextEditor}">

    </ContentPresenter>

TextEditor = new TextEditor()
                         {
                             Name = "TextEditor",
                             FontFamily = new FontFamily("Consolas"),
                             FontSize = 14,
                             ShowLineNumbers = true,
                             WordWrap = false,
                         };

有什么方法可以解决这个问题吗? 感谢

1 个答案:

答案 0 :(得分:0)

我在ContentPresenter上组织了一个绑定内容的快速示例:

在本质上,您需要确保为ContentPresenter正确设置了DataContext,并且该控件是作为DataContext的属性公开的。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ContentPresenter Content="{Binding AControl}" />
</Grid>
</Window>

这是我将用于DataContext的类,它实现INotifyPropertyChanged以确保给定属性的绑定保持最新:

using System.ComponentModel;
using System.Windows.Controls;

namespace WpfApplication1
{
class Class1 : INotifyPropertyChanged
{
    private TextBox aControl;
    public TextBox AControl
    {
        get
        {
            return aControl;
        }
        set
        {
            aControl = value;
            OnPropertyChanged("AControl");
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }
}
}

最后,本例中我的窗口背后的代码负责为Window设置DataContext(后者又为ContentPresenter提供上下文):

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var myObject = new Class1();

        DataContext = myObject;
        myObject.AControl = new TextBox();
        myObject.AControl.Text = "abcd";
    }
}

注意: 我之前的回答是不正确的。 此外,我无法访问或知道您从哪里获取TextEditor控件(它不是标准的wpf控件),但是我希望以相同的方式使用它,我在这里使用TextBox也可以。