是否可以自动神奇地绑定到路径而不明确指定它?

时间:2015-08-07 07:33:17

标签: c# wpf mvvm data-binding

我不确定它是否可能,虽然(懒惰...... 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}" />

1 个答案:

答案 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。)