0

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

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

    </TextEditor>

它工作得很好,但出于某种原因,我想在 c# 代码中创建 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,
                         };

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

4

1 回答 1

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

最后,本示例中我的窗口背后的代码负责设置窗口的 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 相同的方式使用它。

于 2012-08-18T03:17:38.570 回答