【问题标题】:DataGridTemplateColumn with ComboBox and TextBlock带有 ComboBox 和 TextBlock 的 DataGridTemplateColumn
【发布时间】:2012-02-01 03:50:57
【问题描述】:

我正在我的应用程序中动态创建一个 DataGridTemplateColumn。这样做的原因是因为我有一个 TabControl,当用户想要添加一个新选项卡时,会在 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,但我收到一条错误消息,提示“A TwoWay 或 OneWayToSource 绑定无法对 'System.Data.DataRowView' 类型的只读属性 'Account' 起作用。”

【问题讨论】:

    标签: c# wpf xaml datagrid xamlreader


    【解决方案1】:

    您需要将ComboBoxSelectedItem 属性绑定到Account 而不是Text 属性:

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

    编辑

    另一个问题是这样的:

    我尝试将模式设置为 TwoWay,但我收到一条错误消息,提示“A TwoWay 或 OneWayToSource 绑定无法对 'System.Data.DataRowView' 类型的只读属性 'Account' 起作用。”

    如果Account 属性是只读的,您无法更改它,那么编辑它就毫无意义。您需要使其可写,否则您无法从 UI 更改它并且您无法存储任何数据。

    【讨论】:

    • 我已经添加了这个。我仍然无法看到我在 TextBlock 中选择的值。
    • @EricR。我已经更新了我的答案。您还需要从SelectedItem 中删除OneWay 绑定,因为OneWay 意味着只有对对象属性的更改才会传播到UI,而不是相反
    猜你喜欢
    • 2013-01-22
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多