【问题标题】:Textboxes binded to SelectedItem of a code-behind created DataGrid don't actualize绑定到代码隐藏创建的 DataGrid 的 SelectedItem 的文本框不实现
【发布时间】:2016-07-17 01:02:12
【问题描述】:

我正在尝试使用代码隐藏创建的 WPF 掩码作为 WPF 掩码设计器的原型。 在我的 ViewModel 中,我有一个 DataTable 和一个 DataView(这只是 DataTable 的 DefaultView)。 在我的 DataTable 中,我有两列(“vorname”和“nachname”)和四行。 在我的 WPF 掩码中,我想要一个 DataGrid 和两个 TextBoxes,它们绑定到 DataGrid 的 SelectedItem 和列(“vorname”或“nachname”)。 当我在运行时在 DatGrid 中选择一个项目时,该项目的数据将显示在 TextBoxes 中。

首先,我尝试在 XAML 文件中定义 DataGrid,并在代码中生成 TextBoxes 及其绑定。 在这里它工作正常。 我在 DataGrid 中选择了一个项目,该项目的数据显示在 TextBoxes 中。

但是当我在代码中生成网格时,它不再起作用了。 是否有某种我缺少的 NotifyOnSelectedIndexChanged?

我们将不胜感激。

这是 XAML:

<Window x:Class="DesignerTest.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestWindow"
        Height="400"
        Width="600">
    <DockPanel x:Name="mainpanel">
        <!--<DataGrid x:Name="datagrid"
                  DockPanel.Dock="Top"
                  Height="120" />-->
        <WrapPanel x:Name="wrappanel">
            <!--<TextBox x:Name="vornameSelected" Width="150" Margin="5" Text="{Binding SelectedItem.vorname, ElementName=datagrid}" IsEnabled="False" />
            <TextBox x:Name="nachnameSelected" Width="150" Margin="5" Text="{Binding SelectedItem.nachname, ElementName=datagrid}" IsEnabled="False" />-->
            <!--<TextBox x:Name="vornameSelected" Width="150" Margin="5" IsEnabled="False" />
            <TextBox x:Name="nachnameSelected" Width="150" Margin="5" IsEnabled="False" />-->
        </WrapPanel>
    </DockPanel>
</Window>

这是创建和绑定的代码:

    // The ViewModel und the DataTable are created.
    _vm = new SerializingTestViewModel();
    _vm.CreateDataTable();
    this.DataContext = _vm.DataTable;

    // The DataGrid  and it's Binding are created.
    DataGrid datagrid = new DataGrid();
    datagrid.Name = "datagrid";
    DockPanel.SetDock(datagrid, Dock.Top);
    datagrid.Height = 120;
    datagrid.ItemsSource = _vm.DataSource;
    mainpanel.Children.Add(datagrid);

    // The Textboxes and the Bindings are created.
    TextBox vornameSelected = new TextBox();
    vornameSelected.Name = "vornameSelected";
    vornameSelected.Width = 150;
    Thickness margin = new Thickness(5);
    vornameSelected.SetValue(TextBox.MarginProperty, margin);
    vornameSelected.IsEnabled = false;
    Binding selectedItemBinding = new Binding();
    selectedItemBinding.ElementName = "datagrid";
    selectedItemBinding.Path = new PropertyPath("SelectedItem.vorname");
    vornameSelected.SetBinding(TextBox.TextProperty, selectedItemBinding);
    wrappanel.Children.Add(vornameSelected);

    TextBox nachnameSelected = new TextBox();
    nachnameSelected.Name = "nachnameSelected";
    nachnameSelected.Width = 150;
    margin = new Thickness(5);
    nachnameSelected.SetValue(TextBox.MarginProperty, margin);
    nachnameSelected.IsEnabled = false;
    selectedItemBinding = new Binding();
    selectedItemBinding.ElementName = "datagrid";
    selectedItemBinding.Path = new PropertyPath("SelectedItem.nachname");
    nachnameSelected.SetBinding(TextBox.TextProperty, selectedItemBinding);
    wrappanel.Children.Add(nachnameSelected);

【问题讨论】:

  • 你说的“面具”是什么意思?
  • 尝试在绑定中添加一个跟踪,看看你在 VS 输出窗格中得到了什么:System.Diagnostics.PresentationTraceSources.SetTraceLevel(selectedItemBinding, System.Diagnostics.PresentationTraceLevel.High); 我只在 XAML 中使用过它,但它是一个附加属性,所以它应该像那样工作(他乐观地说)。
  • “掩码”是指 WPF 窗口。对不起。
  • 设置selectedItemBinding.Source = datagrid;而不是设置selectedItemBinding.ElementName = "datagrid"是否有效?问题可能是由于项目是通过后面的代码添加的,因此 ElementName 对项目的查找无法正常工作。
  • 抱歉,Rachel,但即使通过设置 Source 属性,它也不起作用。

标签: c# wpf xaml datagrid


【解决方案1】:

尝试使用Source 属性而不是ElementName 设置绑定源

//selectedItemBinding.ElementName = "datagrid"
selectedItemBinding.Source = datagrid;

问题可能是 ElementName 查找项目没有按预期工作,因为项目是在运行时通过后面的代码动态添加的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多