你好我的新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的焦点很烦人
有人知道解决方案吗?
问候
答案 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>