我是WPF的新手,一直在努力找到这个问题的答案几天没有多少运气,似乎应该有办法。我已经设置了一个DataTemplate,其DataType是我的自定义类。在DataTemplate定义中,我使用了一个资源集合。我这样做是因为我想创建一个ObjectDataProvider,它可以用于DataTemplate中的控件 - 我希望这个ObjectDataProvider的ObjectInstance是当前绑定的数据项(列表中的当前实例,我的自定义类) - 因为那么我希望能够在当前数据实例上运行一个方法 - 当用户更改属于DataTemplate的文本框中的文本时。很难解释,但这应该更清楚,这是我的xaml:
<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类的实例。当用户离开文本框txtMaxSupplyDays时,我在代码隐藏中有代码来获取它们输入的值,并将它放入我的ObjectDataProvider的第一个MethodParameter(其键是FilteredItems)。使用下面的C#代码隐藏工作正常,代码找到FilteredItems并将所需的值插入MethodParameter。但我无法想象如何将FilteredItems绑定到PopulateTier的当前实例中,以便它的GetDisplayItems将运行。 (如果这样做,那么可能是DataGrid会刷新,使用GetDisplayItems的输出作为其ItemsSource。)实际上,在下面的C#中,它找到/识别文本框(发送者)的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;
}
答案 0 :(得分:0)
您对代码隐藏有正确的想法 - 它必须尽可能小。它是MVVM模式的口号之一,这就是你所需要的 - 学习MVVM。互联网有很多资源,所以找到它不会有问题。