我實現了一些自定義行爲和觸發器,並通過XAML添加它們。它們在運行時工作正常,但是阻止了Cider設計師在設計時加載視圖,並且大概也會在Blend中導致問題,儘管我還沒有證實。Silverlight中自定義行爲和觸發器的設計時問題
下面是我爲其中一種行爲實施的概述;希望有人能指出我缺少的東西。
行爲看起來像這樣;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Interactivity;
namespace MiX.Core.UI.Silverlight
{
public class UpdateOnTextChangedBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.TextChanged += OnAssociatedObjectTextChanged;
}
void OnAssociatedObjectTextChanged(object sender, TextChangedEventArgs e)
{
BindingExpression binding = this.AssociatedObject.GetBindingExpression(TextBox.TextProperty);
if (binding != null)
{
binding.UpdateSource();
}
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.TextChanged -= OnAssociatedObjectTextChanged;
}
}
}
XAML中的實現如下所示;
<TextBox x:Name="Username" Text="{Binding Username,Mode=TwoWay}" BorderThickness="1" Style="{StaticResource TextBoxStyleGeneral}" Foreground="#FF333333" FontSize="10" BorderBrush="{x:Null}" Grid.Column="1" d:LayoutOverrides="GridBox" Margin="2,0" Grid.ColumnSpan="2" Background="{x:Null}" VerticalAlignment="Center" Grid.Row="1">
<i:Interaction.Behaviors>
<mixcore:UpdateOnTextChangedBehavior/>
</i:Interaction.Behaviors>
</TextBox>
在XAML編輯器中<mixcore:UpdateOnPasswordChangedBehavior/>
元件被突出顯示與波浪和報告錯誤類型「UpdateOnTextChangedBehavior」的值不能被添加到集合或類型「BehaviorCollection」的字典。當試圖在設計視圖中查看設計器無法加載時,聲明該文檔包含必須在加載設計器之前修復的錯誤。
開始一個新項目,並複製你的示例代碼似乎VS2010工作的罰款(對我來說),沒有設計師或混合的問題。你是否在代碼隱藏中使用TextBox或行爲做其他事情? – 2010-08-24 15:56:24
丹,看起來你是對的。在真實應用程序中,除了這種行爲之外,還有兩個動作,我看到其中一個動作是調用一個使用反射來設置依賴項屬性值的方法。也許這就是阻止它在設計時工作的原因。 – 2010-08-25 07:48:07