带有ComboBox和TextBlock的DataGridTemplateColumn

时间:2012-01-03 00:10:49

标签: c# wpf xaml datagrid xamlreader

我正在我的应用程序中动态创建DataGridTemplateColumn。原因是因为我有一个TabControl,当用户想要添加一个新的Tab时,会在TabItem中创建一个Datagrid。这是我到目前为止创建列的代码:

    private DataGridTemplateColumn GetAccountColumn()
    {
        DataGridTemplateColumn accountColumn = new DataGridTemplateColumn();
        accountColumn.Header = "Account";

        string xaml = @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
                            <TextBlock Text=""{Binding Path='Account', Mode=OneWay}"" />
                        </DataTemplate>";

        StringReader stringReader = new StringReader(xaml);
        XmlReader xmlReader = XmlReader.Create(stringReader);

        accountColumn.CellTemplate = (DataTemplate)XamlReader.Parse(xaml);

        xaml = @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
                     <ComboBox ItemsSource=""{DynamicResource accounts}"" Text=""{Binding Path='Account', Mode=OneWay}"" Height=""23"" IsTextSearchEnabled=""True""/>
                 </DataTemplate>";

        stringReader = new StringReader(xaml);
        xmlReader = XmlReader.Create(stringReader);

        accountColumn.CellEditingTemplate = (DataTemplate)XamlReader.Parse(xaml);

        return accountColumn;
    }

组合框中装满了物品。从上面的代码中可以看出,itemsource绑定到一个可观察的字符串集合。我在运行时通过以下方式填充资源:

Resources["accounts"] = this.Account;

一切似乎都很好用,除了在组合框中进行选择并且组合框失去焦点之外,我选择的项目不会显示在TextBlock中。如何让这个项目出现在TextBlock中?我尝试将模式设置为TwoWay,但是我收到一条错误消息“两个或两个OneWayToSource绑定无法在'System.Data.DataRowView'类型的只读属性'Account'上工作。”

1 个答案:

答案 0 :(得分:1)

您需要将SelectedItem的{​​{1}}属性绑定到ComboBox而不是Account属性:

Text

修改

另一个问题是:

  

我尝试将模式设置为TwoWay但是我收到一条错误消息“两个或两个OneWayToSource绑定无法在'System.Data.DataRowView'类型的只读属性'Account'上工作。”

如果 xaml = @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> <ComboBox ItemsSource=""{DynamicResource accounts}"" SelectedItem=""{Binding Path='Account'}"" Height=""23"" IsTextSearchEnabled=""True""/> </DataTemplate>"; 属性是只读的,则无法更改它,那么编辑它根本就没有意义。您需要使其可写,否则您无法从UI更改它,并且您无法存储任何数据。