0

Content単純なラベルのプロパティを他のクラスのプロパティにバインドしようとしています。私はすでにさまざまなアプローチを試みましたが、まだうまくいきませんでした。

ソース クラス (MainWindow.xaml.cs) のプロパティは次のとおりです。

    public String FileTitle
    {
        get
        {
            return this.GetValue(FiletitleProperty) as string;
        }
        set
        {
            this.SetValue(FiletitleProperty, value);
        }
    }

    public DependencyProperty FiletitleProperty;


    public MainWindow()
    {           

        FiletitleProperty = DependencyProperty.Register("FileTitle", typeof(String), typeof(MainWindow));
        ...
    }

私のターゲットクラスには、ソースクラスと呼ばれるオブジェクトがありますCallbackObject(命名はあまり適していません)

バインディングの私のxamlコードは次のとおりです。

<Label x:Name="lblFiletitle" Content="{Binding Source=CallbackObject, Path=FileTitle}" Margin="10,213,10,0" Height="35" VerticalAlignment="Top" FontSize="16" Padding="0,5,5,5" />

そのようにすることは可能ですか、それとももっと複雑で洗練されていないものにする必要がありますか?

4

2 に答える 2

1

CallbackObjectコードビハインドにある場合は、次を試してください:

<Label Content="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=UserControl,Mode=FindAncestor}, Path=CallbackObject.FileTitle}" />
于 2013-01-15T18:47:22.403 に答える
0

ラベルがUserControlまたはPage内に配置されている場合、UserControlにそのオブジェクトのインスタンスまたは参照を作成せずに、別のオブジェクト(Windowなど)のプロパティに直接バインドすることはできません。階層内の親要素(XAMLの最上位要素)は、子要素のDataContextスコープを定義します。それらは、そのスコープ内のものにのみバインドできます。

これにはいくつかの回避策があります。

  1. 静的プロパティを比較的簡単に呼び出してから、「{x:Staticlocal:StaticClass.StaticProperty}」のようなバインディングを呼び出すことができます。

  2. UserControl(XAMLまたはコードビハインド)で参照オブジェクトのインスタンスを作成し、UserControlのDataContextをそれ自体に設定できます。参照されるオブジェクトは、パブリックgetおよびset(必要な場合)アクセサーを使用してパブリックプロパティに公開する必要があります。INotifyPropertyChanged(どちらか好きな方)を実装する場合は、dependecyプロパティは必要ありません。

  3. 別のウィンドウまたは別のViewModelからデータを取得する場合は、さまざまな方法があります。ここに投稿するには長すぎます(そして「利用可能」すぎます)。すばやく検索すると、多くの結果が得られます。

あなたの場合、アプリにはMainWindowが1つしかないので、静的プロパティを作成して現在のMainWindowインスタンスを返し、どこからでもそのプロパティのいずれかにバインドできると思います。

MainWindow.xaml.cs内のこのコード

    private static MainWindow_instance;
    public static MainWindow Instance
    {
        get
        {
            if (_instance == null)
                _instance = new MainWindow();
            else
                _instance = this;

            return _instance;
        }
    }

警告:これは特定の状況で機能しますが、メインウィンドウで使用したことはなく、これがベストプラクティスかどうかはわかりません。ただし、機能します。

よろしくお願いします。

于 2013-01-15T18:38:50.167 に答える