WPF绑定对象到文本框并使用DataTemplate

时间:2017-07-20 13:11:47

标签: c# .net wpf

你好我的新WPF项目有些问题。 我有一个包含不同对象的ListView。当用户选择一个对象时,"详细信息"此对象的属性也位于listview旁边的文本框中。

选择对象 - >对象转到文本框 - >带有数据模板的文本框当前对象

在我的测试项目中,我用第二个listview修复了它。

private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if(listView.SelectedItem is Entity)
    {
        listView1.Items.Clear();
        listView1.Items.Add(listView.SelectedItem);
    }
}

文本框的数据模板,在本例中我将它用于第二个listView

<DataTemplate  DataType="{x:Type local:Entity}">
   <TextBox Text="{Binding A1}" />
</DataTemplate>

A Screenshot from my test project

我想在这个截图中解决问题,但是没有listview,因为我需要复制属性并且listview的焦点很烦人

有人知道解决方案吗?

问候

2 个答案:

答案 0 :(得分:0)

您不需要任何代码。 只需设置Name的{​​{1}}属性即可;例如像这样

ListView

然后为选择更改时要显示的每个媒体资源添加<ListView x:Name="MyItems"

TextBox

<TextBox Text="{Binding ElementName=MyItems, Path=SelectedItem.Prop1}"/> 是您要显示的媒体资源的名称。

修改 如果列表中有不同类型的对象,并且您希望以不同的方式显示不同类型的属性,则可以使用Prop1

ContentControl

当您选择<ContentControl Content="{Binding ElementName=MyItems, Path=SelectedItem}"> <ContentControl.Resources> <DataTemplate DataType="{x:Type local:ObjectOne}"> <StackPanel> <TextBox Text="{Binding Prop1}"/> <TextBox Text="{Binding Prop2}"/> </StackPanel> </DataTemplate> <DataTemplate DataType="{x:Type local:ObjectTwo}"> <StackPanel> <TextBox Text="{Binding Prop1}"/> <TextBox Text="{Binding Prop2}"/> <TextBox Text="{Binding Prop3}"/> </StackPanel> </DataTemplate> </ContentControl.Resources> </ContentControl> 类型的项目时,ContentControl会显示第一个DataTemplate,当您选择ObjectOne类型的项目时,DataTemplate会显示第二个ObjectTwo

希望这是你想要的;)

答案 1 :(得分:0)

创建一个自定义TextBox,它可以反映属性并根据需要加载Text。使用该自定义文本框并将对象绑定到它。

示例:

public class PropertyViewerTextBox : TextBox
{
    public object Item
    {
        get { return (object)GetValue(ItemProperty); }
        set { SetValue(ItemProperty, value); }
    }

    public PropertyViewerTextBox()
    {
        this.TextWrapping = TextWrapping.Wrap;
        this.AcceptsReturn = true;
    }

    // Using a DependencyProperty as the backing store for Item.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ItemProperty =
        DependencyProperty.Register("Item", typeof(object), typeof(PropertyViewerTextBox), new PropertyMetadata(OnItemChanged));

    public static void OnItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var textbox = sender as PropertyViewerTextBox;
        if (null == e.NewValue)
        {
            textbox.Text = string.Empty;
            return;
        }

        var props = e.NewValue.GetType().GetProperties();
        var text = new StringBuilder();
        foreach(var prop in props)
        {
            text.AppendFormat("{0}{1}", prop.Name, Environment.NewLine);
        }

        textbox.Text = text.ToString();
    }
}

创建此自定义文本框后,更改数据模板并使用自定义文本框,绑定到Item属性。在您选择对象时,它将显示所有属性。

<DataTemplate  DataType="{x:Type local:Entity}">
   <local:PropertyViewerTextBox Item="{Binding A1}" />
</DataTemplate>