如何“;链“;绑定

本文关键字:绑定 如何 | 更新日期: 2023-09-27 18:19:47

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

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

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

第一个输入绑定到视图模型属性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 };
}

有人知道我做错了什么吗?我觉得这与转换器有关,因为我没有按照在线示例中描述的方式使用它。有没有其他方法可以实现我正在尝试的目标?

如何“;链“;绑定

我认为从代码中这样做更有意义:如果_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,因此设置该值应该没有问题。