我不确定它是否可能,虽然(懒惰...... hrmp ...... 高效)我仍然想问。 DataGrid 具有根据发送到其中的元素的字段自动创建列的功能。
但是,在我的应用程序中,我们已禁用内联数据编辑,而当用户单击某行时,会弹出一个对话框,用于编辑每个字段的值。对应于单击行的对象。
我发送对应于单击对话框的行的对象,并将其用作数据上下文。这意味着,我现在需要明确指定每个字段的绑定,如下所示。
<TextBox x:Name="SomeName"
Style="{StaticResource DefaultTextBoxStyle}"
Text="{Binding Path=SomeProperty,Mode=TwoWay}" />
我很好奇是否有可能以某种方式制作字段&#34;有点实现&#34;他们需要从数据上下文的字段中选择他们的绑定值(基于他们的名字等)。这样的事情。
<TextBox x:Name="CertainString"
Style="{StaticResource DefaultTextBoxStyle}"
Text="{Binding CertainStringOrSomething}" />
答案 0 :(得分:1)
我认为实现这一目标的唯一方法(如果我的问题是对的),就是用MultiValueConverter
做到这一点。您将整个ViewModel和当前Xaml元素的名称传递给转换器。
<TextBlock Name="FirstName">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource propertyResolver}">
<Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
<Binding Path="Person"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
在转换器中,您使用relfection访问该属性并将其返回:
public class PropertyResolver : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
if (!(values[1] is Person)) throw new ArgumentException("please pass a person");
var person = (Person)values[1];
var property = values[0].ToString();
return person.GetType().GetProperty(property).GetValue(person, null);
}
}
(ExampleData:ViewModel包含属性public Person Person { get; set; }
,而Person类在此示例中具有属性FirstName
。)