0

次のように、チェックボックス ischecked を xaml の別の要素にバインドできます

<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 でコンテンツをバインドする簡単な例をまとめました。

本質的に、DataContext が ContentPresenter に対して正しくセットアップされていること、およびコントロールが 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 に答える