文字列が同一の場合、WPFフォームのテキストボックスでビューに印刷/バインド/投稿していないことが起こっています。たとえば、ランダムを使用して文字列にするバイト配列を生成すると、ビューに投稿されます。
ビューがバインドされているViewModelは次のとおりです。
public class ViewModel : INotifyPropertyChanged
{
public StringBuilder Data
{
get { return _data; }
set
{
_data = value;
OnPropertyChanged("Data");
}
}
private Service service = new Service();
private StringBuilder _data;
public ViewModel()
{
service.BytesArrived += ServiceOnBytesArrived;
ThreadPool.QueueUserWorkItem(starupService);
}
private void starupService(object state)
{
service.Start();
}
private void ServiceOnBytesArrived(byte[] bytes)
{
var sBuilder = new StringBuilder();
foreach (var b in bytes)
{
sBuilder.Append(b.ToString() + ", ");
}
Data = sBuilder;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
これは、私のためにバイトを印刷するだけのサービスです(代わりにランダムが使用されている場合は正常に機能します:
public class Service
{
public void Start()
{
var random = new Random(DateTime.Now.Minute);
while (true)
{
//random.NextBytes(bytes);
for (int i = 0; i < 10; i++)
{
bytes[i] = 0;
Thread.Sleep(10);
}
//Thread.Sleep(100);
BytesArrived(bytes);
}
}
private byte[] bytes = new byte[10];
public event Action<byte[]> BytesArrived;
}
私が使用している AppendText を使用するための依存関係プロパティは次のとおりです。
public static class TextBoxAttachedBehaviors
{
#region AppendText Attached Property
public static string GetAppendText(TextBox textBox)
{
return (string)textBox.GetValue(AppendTextProperty);
}
public static void SetAppendText(
TextBox textBox, string value)
{
textBox.SetValue(AppendTextProperty, value);
}
public static readonly DependencyProperty AppendTextProperty =
DependencyProperty.RegisterAttached(
"AppendText",
typeof(string),
typeof(TextBoxAttachedBehaviors),
new UIPropertyMetadata(null, OnAppendTextChanged));
private static void OnAppendTextChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (e.NewValue == null)
return;
TextBox textBox = d as TextBox;
textBox.AppendText(e.NewValue.ToString());
}
#endregion
}
XAML:
<TextBox attachedBehaviors:TextBoxAttachedBehaviors.AppendText="{Binding TextBoxAppend}"/>
ReSharper をお持ちの場合は、名前空間を置き換えることを提案します。たとえばattachedBehaviors:
、クラスへのリンクを実際に添付されたビヘイビア (私の場合はxmlns:attachedBehaviors="clr-namespace:Support.NetworkMonitor.AttachedBehaviors"
.