0

我有一个实体框架模型绑定到这样的对象:

public class Object
{
    public string _name; //actual name
    public string _display_name;
    ....
}

在大多数情况下,display_name 将与 actual_name 相同。因此,在 WPF 窗口中,我有一个带有两个输入(文本框)的视图。

第一个输入绑定到视图模型属性 DisplayName。这样做的目的是使第二个输入(显示名称)默认等于第一个(实际名称):

<TextBox x:Name="NameInputBox" Margin="5,5,5,5" Width="100" MaxLength="50"
                         Text="{Binding Path=Name, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />

第二个输入是使用 MultiBinding。MultiBinding 中的第一个绑定是到第一个输入的 Text 属性。这会正确地将第二个框更新为等于第一个框。

第二个绑定绑定到视图模型中的 DisplayName 属性。尽管第二个输入文本正在更改,但未设置 DisplayName 属性:

<TextBox x:Name="DisplayNameInput" Margin="5,5,5,5" Width="100" MaxLength="50">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource TwoToOneConverter}">
            <Binding ElementName="NameInputBox" Path="Text" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
            <Binding Path="DisplayName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

以下是属性:

public String Name
{
    get { return _name; }
    set
    {
        _name = value;
        OnPropertyChanged("Name");
    }
}

public string DisplayName
{
    get { return _display_name; }
    set
    {
        _display_name = value;
        OnPropertyChanged("DisplayName");
    }
}

最后,我的转换器:

/// <summary>
/// When given two inputs, just take one of them.
/// </summary>
public object Convert(object[] values, Type targetType, object parameter, 
    System.Globalization.CultureInfo culture) 
{
    return values[0];
}

/// <summary>
/// Return the value, unchanged, as two values.
/// </summary>
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
    System.Globalization.CultureInfo culture)
{
    return new object[] { value, value };
}

有人对我做错了什么有任何想法吗?我觉得它与转换器有关,因为我没有按照在线示例中描述的方式使用它。还有另一种方法可以实现我正在尝试的目标吗?

4

1 回答 1

1

我认为从代码中执行此操作会更有意义:如果_display_namenull,则DisplayName返回Name。这也意味着您需要添加OnPropertyChanged("DisplayName");到您的Name二传手:

public String Name
{
    get { return _name; }
    set
    {
        _name = value;
        OnPropertyChanged("Name");
        OnPropertyChanged("DisplayName");
    }
}

public string DisplayName
{
    get { return _display_name ?? _name; }
    set
    {
        _display_name = value;
        OnPropertyChanged("DisplayName");
    }
}

有了这个,您可以使用 normalBinding而不是MultiBinding,因此设置该值应该没有问题。

于 2013-06-24T19:35:26.340 回答