私はWPFにはかなり新しいですが、これは数日間運行することなく、これに対する答えを見つけることに取り組んできました。私はDataTemplateをセットアップしました。DataTemplateのデータ型は私のカスタムクラスです。 DataTemplate定義の中で、私は、を使用してリソースコレクションを設定しました。これは、DataTemplateのコントロールで使用できるObjectDataProviderを作成するためです。このObjectDataProviderのObjectInstanceを現在のデータ項目(カスタムクラスのリスト内の現在のインスタンス)にする必要があります。なぜなら、 DataTemplateの一部であるテキストボックス内のテキストをユーザーが変更すると、現在のデータインスタンスでメソッドを実行できるようにしたいと考えています。オブジェクトインスタンスを現在のデータアイテムに設定する
<DataTemplate x:Key="TierDisplay" DataType="{x:Type tiers:PopulatedTier}">
<DataTemplate.Resources>
<ObjectDataProvider x:Key="FilteredItems" MethodName="GetDisplayItems">
<ObjectDataProvider.MethodParameters>
<sys:Int32>0</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</DataTemplate.Resources>
<StackPanel Orientation="Vertical">
<TextBox Name="txtMaxSupplyDays" LostFocus="txtMaxSupplyDays_LostFocus"></TextBox>
<DataGrid ItemsSource="{Binding Source={StaticResource FilteredItems}}" />
</StackPanel>
</DataTemplate>
のDataTemplateの各インスタンスはPopulatedTierクラスのインスタンスにバインドされています。説明するのは難しいが、これはそれをより明確にする必要があり、ここに私のXAMLです。ユーザーがテキストボックスtxtMaxSupplyDaysを離れるとき、コードビハインドにコードを入力して、ObjectDataProvider(そのキーはFilteredItems)の最初のMethodParameterに入れます。これは、下のC#コードビハインドを使用してうまく動作し、コードはFilteredItemsを見つけ、目的の値をMethodParameterにプラグインします。しかし、私は、GetDisplayItemsが実行されるようにFilteredItemsをPopulatedTierの現在のインスタンスに結びつける方法を理解することはできません。実際には、以下のC#では、Textbox(送信者)のDataContextプロパティをPopulatedTierのインスタンスとして検出/認識します。しかし、これをObjectDataProvider定義内のXAMLでどのように参照できますか?私がさらに明確にできるかどうか私に知らせてくれてありがとう。クスレの代わりの提案は大歓迎です。私はできるだけ多くのXAMLとコードビハインドを維持したいと思います。
private void txtMaxSupplyDays_LostFocus(object sender, RoutedEventArgs e)
{
var textBox = sender as TextBox;
if (textBox == null) return;
int value;
bool valueOK = Int32.TryParse(textBox.Text, out value);
if (valueOK)
((ObjectDataProvider)textBox.FindResource("FilteredItems")).MethodParameters[0] = value;
}