2012-09-29 21 views
3

比方說,我有一個結合的東西,在代碼隱藏列表框:後面數據綁定在XAML(可多方式結合?)

<ListBox x:Name="list"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <ListBoxItem Content="{Binding Name}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

<TextBox x:Name="name" Text="{Binding ElementName=list, Path=SelectedItem.Name, Mode=TwoWay" /> 
<TextBox x:Name="contents" Text="{Binding ElementName=list, Path=SelectedItem.Contents, Mode=TwoWay" /> 

代碼:

public class Dude 
{ 
    public String Name { get; set; } 
    public String Contents { get; set; } 
} 

現在上面並正是我想要的。選擇列表框中的項目時,文本框將更新以顯示在列表框中選擇的內容。

但是現在我要做的是通過添加字典將它擴大我的哥們類:

public class Dude 
{ 
    public string Name { get; set; } 
    public string Contents { get; set; } 
    public Dictionary<String, String> Tasks { get; set; } 
} 

在希望,我可以:

中單擊某個項目列表框中,將相應項目的名稱和 內容屬性顯示在其各自的文本框中,然後 向內容文本框追加內容的鍵值/字典的 內容。

但我不知道我該如何去那麼深。它有點覺得我要去多層次,像多維的綁定是我需要的東西?

是否有任何(簡單)樣品您有或已經看到?文檔,文章,教程?

任何幫助,非常感謝。

謝謝

+2

我認爲更好的解決方案可能會涉及您綁定到Tasks屬性的列表框或其他ItemsControl,而不是將Tasks對添加到已綁定到Contents屬性的控件。但是我已經完成了XAML綁定已經很長時間了,所以我現在恐怕沒有更好的答案。祝你好運! – phoog

+1

這可能是使用的http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/ – user3357963

+1

你的字典必須是靜態或我不看到使用。你可以做的是改變綁定,使其通知目標更新,然後捕獲TargetUpdated事件。 (http://msdn.microsoft.com/en-us/library/system.windows.data.binding.notifyontargetupdated.aspx) – GameAlchemist

回答

3

你想在WPF(在其他XAML技術,例如WP7或者WinRT的有點困難)來完成,但我不知道它是什麼,你需要 ...什麼

使用MultiBinding將Contents字符串和Tasks字典綁定到第二個文本框,然後編寫自己的IMultiValueConverter來構建要顯示的字符串。

閱讀tutorial about MultiBindings here,和粗糙的代碼應該是這個樣子:

<TextBox> 
    <TextBox.Text> 
     <MultiBinding Converter="{StaticResource YourAppendingConverter}"> 
     <Binding ElementName="list" Path="SelectedItem.Contents" /> 
     <Binding ElementName="list" Path="SelectedItem.Tasks" /> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox> 

和你的轉換器應該像:

public class YourAppendingConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture){ 
     StringBuilder sb = new StringBuilder(values[0].ToString()); 
     sb.AppendLine("Tasks:"); 
     foreach (var task in (Dictionary<string,string>)values[1]){ 
     sb.AppendLine(string.Format("{0}: {1}", task.Key, task.Value)); 
     } 
     return sb.ToString(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, 
     System.Globalization.CultureInfo culture){ 
     throw new NotSupportedException(); 
    } 

爲什麼我覺得這是你需要什麼?

  1. 如果需要寫一個ConvertBack是地獄 - 所以這個文本框應該是隻讀
  2. 字典沒有通知。如果底層詞典在顯示時發生變化,則不會有任何變化

如果您認爲這些通過了,那麼MultiBinding可能就是您需要的工具。

+0

哇,非常感謝@TDaver。有時候就像這樣,我真的很想念WinForms的簡單性。 –

+1

@ProtectedIdentity:實際上我發現這更合乎邏輯:) – TDaver