将objectinstance设置为当前数据项

时间:2011-07-05 15:37:45

标签: wpf datatemplate datacontext

我是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;
    }

1 个答案:

答案 0 :(得分:0)

您对代码隐藏有正确的想法 - 它必须尽可能小。它是MVVM模式的口号之一,这就是你所需要的 - 学习MVVM。互联网有很多资源,所以找到它不会有问题。