7

WPF とのバインドについて詳しく学んでいたので、興味がありました。データ コンテキストを設定して、単一のプロパティの {binding path=} を設定する必要がありますか? コードビハインドのMVVMの例から学んでいたので、私はただ興味がありました.ViewModelのデータコンテキストではないものにバインドしたい状況があるようです.バインディング。では、2 番目のデータ コンテキストまたは同様のものを参照するために、さらに別のクラスを参照できますか? または、リソース キーを設定してクラスを参照することはできますか? 可能であれば、最終的には別のクラスのプロパティにアクセスしたいと考えています。

例えば:

<Window x:Class="WPFTestBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:da="clr-namespace:WPFTestBinding.DataAccess"
        xmlns:main="clr-namespace:WPFTestBinding"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Label Content="Here we go: "/>
            <TextBox x:Name="testtext" />
            <Label Height="50" />
            <!-- CODE BELOW WILL NOT WORK -->
            <TextBox Text="{Binding Path=TestID}" x:Name="testtext2" />
        </StackPanel>
    </Grid>
</Window>

コードビハインドで TextBox の値を設定できることはわかっています。プロパティの例では機能しますが、バインディングでは機能しません。クラスのプロパティに対してその場で単純なバインディングを行う方法はありますか? これを行う単純な例は見つかりませんでした。オンラインで検索し、バインドを学習している間、ほとんどの例は、設定データ コンテキストの非常に強力なセットまたは非常に単純な静的リソースの例のいずれかです。{Binding Path=} を使用して、その場で他のプロパティを拡張して、クラス内のコードを取得できるかどうかに興味がありました。

コードの残りの部分は非常に単純です。

namespace WPFTestBinding.DataAccess
{
    class Test
    {
        public string TestID { get { return "This is my test"; } }
    }
}

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

           DataAccess.Test t = new Test();

           testtext.Text = t.TestID;  // code behind works easily
         }
    }
4

4 に答える 4

11

XamlでDataContextを次のように設定できます。

<Window xmlns:da="clr-namespace:WPFTestBinding.DataAccess">
    <Window.DataContext>
        <da:Test/>
    <Window.DataContext>

    <TextBox Text="{Binding TestID}"/>
</Window>
于 2013-01-07T06:04:29.663 に答える
8

注意すべき点:

  • バインドしようとしているプロパティTestIDは、get-accessor しかないため、読み取り専用です。したがって、Binding はOneWayオンリーにする必要があります。
  • DataContext の割り当て: MainViewModel などのモデルを保持するインスタンスを ICollection<BaseViewModel> プロパティ (コレクション内のすべての派生インスタンスを持つ) または直接モデル自体 (あなたの場合のように) に割り当てることができます。以下のコードで行ったように。

コード

namespace WPFTestBinding.DataAccess
{
    class Test
    {
        public string TestID { get { return "This is my test"; } }
    }
}

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

       DataAccess.Test testInstance = new Test();
       this.DataContext = testInstance;
    }
}

XAML

<TextBox Text="{Binding Path=TestID, Mode=OneWay}" x:Name="txtTestID" />

詳細については、次を参照してください。

于 2013-01-07T06:21:11.313 に答える
6

データ コンテキストが設定されていません。DataBinding は TestID を取得する場所を知りません。正しいコードビハインドは次のとおりです。

namespace WPFTestBinding.DataAccess
{
    class Test
    {
        public string TestID { get { return "This is my test"; } }
    }
}

public partial class MainWindow : Window
{    
    public MainWindow()
    {
       InitializeComponent();
       DataAccess.Test t = new Test();

       DataContext = t;           
    }
}
于 2013-01-07T06:00:16.250 に答える