經過20多年的編程窗口和WPF兩天我覺得我什麼都不知道:-)綁定列表<string>到一個TextBox
我的第一個WPF程序是非常簡單的:你從資源管理器拖放了一些文件和他們的名字顯示在一個TextBox控件中。 (對於ListBox來說,它工作正常,但這不是我想要的,當然在Drop事件中手動添加行也是可行的 - 但我想了解Binding方法..)
So我寫了一個轉換器,但不知怎麼它沒有使用(斷點不會被打),什麼也沒有顯示。
它應該是一件小事,或者我完全偏離軌道。找到了許多類似的東西的例子,我一起修補它,但仍然無法使它工作。
(我可能不會需要ConvertBack,但它寫下來呢..)
這裏是轉換器類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace WpTest02
{
public class ListToTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
StringBuilder sb = new StringBuilder();
foreach (string s in (List<string>)value) sb.AppendLine(s);
return sb.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string[] lines = ((string)value).Split(new string[] { @"\r\n" }, StringSplitOptions.RemoveEmptyEntries);
return lines.ToList<String>();
}
}
}
的MainWindow.xaml,在那裏我懷疑綁定問題是:
<Window x:Class="WpTest02.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpTest02"
Title="MainWindow" Height="350" Width="525"
>
<Window.Resources>
<local:ListToTextConverter x:Key="converter1" />
</Window.Resources>
<Grid >
<TextBox Name="tb_files" Margin="50,20,0,0" AllowDrop="True"
PreviewDragOver="tb_files_PreviewDragOver" Drop="tb_files_Drop"
Text="{Binding Path=fileNames, Converter={StaticResource converter1} }"
/>
</Grid>
</Window>
而且隨着罷了代碼隱藏data屬性結合並拖動&下降代碼,其中工程。
using System;
//etc ..
namespace WpTest02
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
fileNames = new List<string>();
}
public List<string> fileNames { get; set; }
private void tb_files_Drop(object sender, DragEventArgs e)
{
var files = ((DataObject)e.Data).GetFileDropList();
foreach (string s in files) fileNames.Add(s);
// EDIT: this doesn't help ? Wrong!
// EDIT: this is actually necessary! :
tb_files.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
// this obviosly would work:
//foreach (string s in files) tb_files.Text += s + "\r\n";
}
private void tb_files_PreviewDragOver(object sender, DragEventArgs e)
{
e.Handled = true;
}
}
}
注意:我已經editied的最後一塊代碼強調UpdateTarget
呼叫重要性。
謝謝。其實我原來的程序中有這條線。我發佈的是一個精簡版。但現在我有了一個工作版本,我將能夠用原始代碼追蹤探針(s)。 – TaW