如何将动态生成的TextBoxes绑定到WPF中的DataGrid值?

时间:2019-03-01 12:53:26

标签: c# wpf xaml binding imultivalueconverter

我的问题基本上在本主题的标题中描述。

我有一个数据网格,它动态地填充了各种条目:

<DataGrid
    x:Name="searchResult"
    AutoGenerateColumns="True"
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Path=SearchResult}" />

它旁边是一堆TextBoxes,它们也是动态生成的:

<ItemsControl
    x:Name="searchForm"
    ItemTemplate="{StaticResource formInputTest}"
    ItemsSource="{Binding SearchForm, UpdateSourceTrigger=PropertyChanged}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

我在ItemsControl中使用的模板基本上是这样的:

<TextBox
    Tag="{Binding Index}"
    Text="{Binding ElementName=searchResult, Path=SelectedValue.a, UpdateSourceTrigger=PropertyChanged}" />

现在让我们假设我的数据网格有2列(a和b),而我有2个具有相同名称(a和b)的文本框。 现在,我想选择一个数据网格,然后像两个文本框一样自动用对应行中的值填充。

不幸的是,我不知道如何获得动态绑定。 如果我将TextBox的Text-property静态绑定到searchResult-> SelectedValue.a,它可以正常工作,但是如您所见,它只能是静态的。 那就是我在上面第三个代码框中所做的。

包含文本框的ItemsControl具有与“ SearchForm”的绑定。 SearchForm具有属性“ Index”,这是列的名称。 因此,TextBox知道必须绑定到的列的名称。为了澄清这一点,我将TextBox.Tag绑定到Index,效果很好。

基本上,我希望我的TextBox-Binding看起来像这样:

<TextBox
    Text="{Binding ElementName=searchResult, Path=SelectedValue.{Binding Index}, UpdateSourceTrigger=PropertyChanged}" />

但是,您可能知道,绑定内部的绑定不起作用。

有人知道如何将它们绑定到动态生成的对象吗? 感谢您的提示!

更新2019/03/07

感谢水牛! 这为我带来了一些进步,但我仍未达到终点。

我创建了view-model属性,并将Datagrid-SelectedItem和TextBox-Text属性都绑定到该属性。 由于SelectedItem是一种词典(BindablePublicDictionary),因此我在TextboxBinding上使用了一个转换器(IMultiValueConverter),将词典条目转换为文本框的索引和文本/值。

这工作正常,我选择了一个数据网格行,并自动填充了3个动态生成的输入字段。

不幸的是,如果我编辑这些填充的文本框之一,则另两个将被清空,而我的数据网格不变。

我实现了OnPropertyChanged,我的绑定是TwoWay,并且调用ConvertBackFunction并从函数本身返回符合targetType类型的数据。

有人对数据网格/字典和文本框之间的绑定/转换器有经验吗,尤其是有关convertBack函数?

0 个答案:

没有答案