如何“链接”绑定?

时间:2013-06-24 18:52:03

标签: c# .net wpf data-binding mvvm

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

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

display_name大部分与actual_name相同。因此,在WPF窗口中,我有一个带有两个输入的视图(TextBox)。

第一个输入绑定到View Model属性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 };
}

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

1 个答案:

答案 0 :(得分: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");
    }
}

有了这个,您可以使用普通Binding代替MultiBinding,因此设置值应该没有问题。