我可以将一个复选框重新绑定到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,
};
有什么方法可以解决这个问题吗? 感谢
答案 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也可以。