2013-06-24 21 views
0

我有一個綁定到一個對象像這樣的實體框架模型:如何「鏈接」綁定?

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 }; 
} 

任何人有任何想法我不正確地做什麼?我覺得它與轉換器有關,因爲我沒有按照在線樣本描述的方式使用它。有沒有另一種方法來實現我正在嘗試的?

+2

我認爲從代碼中這樣做會更有意義:如果'_display_name'爲'null','DisplayName'返回'Name'。這也意味着您需要將'OnPropertyChanged(「DisplayName」);'添加到'Name'設置器。 – svick

+0

這聽起來像個好主意,謝謝! – Lycus

+1

我懷疑你的轉換器可能會有效地強迫價值永不改變。轉換器始終處於活動狀態 - 它將不斷返回「轉換」的結果,該轉換始終爲值[0](名稱)。所以即使displayname(值[1])改變,文本也會重置爲值[0]。 – nmclean

回答

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,所以應該有與設定值沒有問題。