7

Windows ストア アプリ用のプロパティが添付されたカスタム テキスト ボックスを作成したいと考えています。私はこの解決策に従っています。ハードコーディングされた値をプロパティ値として使用するようになりましたが、バインディングを使用して値を設定したいのですが、機能していません。私はたくさん検索しようとしましたが、解決策を助けませんでした。

例外の詳細は次のようになります

タイプ 'Windows.UI.Xaml.Markup.XamlParseException' の例外が CustomTextBox.exe で発生しましたが、ユーザー コードで処理されませんでした

WinRT 情報: プロパティ 'CustomTextBox.Input.Type' への割り当てに失敗しました。

MainPage.xaml

<!-- local:Input.Type="Email" works -->
<!-- local:Input.Type="{Binding SelectedTextboxInputType}" not working -->

<TextBox x:Name="txt" local:Input.Type="{Binding SelectedTextboxInputType}" Height="30" Width="1000" />

<ComboBox x:Name="cmb"  ItemsSource="{Binding TextboxInputTypeList}" SelectedItem="{Binding SelectedTextboxInputType}" Height="30" Width="200" 
          Margin="451,211,715,527" />

MainPage.xaml.cs

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        DataContext = new ViewModel();
    }
}

入力.cs

//InputType is enum
public static InputType GetType(DependencyObject obj)
{
    return (InputType)obj.GetValue(TypeProperty);
}

public static void SetType(DependencyObject obj, InputType value)
{
    obj.SetValue(TypeProperty, value);
}

public static readonly DependencyProperty TypeProperty =
    DependencyProperty.RegisterAttached("Type", typeof(InputType), typeof(TextBox), new PropertyMetadata(default(InputType), OnTypeChanged));

private static void OnTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    if (e.NewValue is InputType)
    {
        var textBox = (TextBox)d;
        var Type = (InputType)e.NewValue;
        if (Type == InputType.Email || Type == InputType.URL)
        {
            textBox.LostFocus += OnLostFocus;
        }
        else
        {
            textBox.TextChanged += OnTextChanged;
        }
    }
}

ViewModel.cs

public class ViewModel : BindableBase
{
    public ViewModel()
    {
        TextboxInputTypeList = Enum.GetValues(typeof(InputType)).Cast<InputType>();
    }

    private InputType _SelectedTextboxInputType = InputType.Currency;
    public InputType SelectedTextboxInputType
    {
        get { return _SelectedTextboxInputType; }
        set { this.SetProperty(ref this._SelectedTextboxInputType, value); }
    }

    private IEnumerable<InputType> _TextboxInputTypeList;
    public IEnumerable<InputType> TextboxInputTypeList
    {
        get { return _TextboxInputTypeList; }
        set { this.SetProperty(ref this._TextboxInputTypeList, value); }
    }
}
4

2 に答える 2

10

これはよくある間違いです。問題は、バインディング ターゲットを XAML の CLR プロパティにできないことです。それはただのルールです。バインディング ソースは、CLR プロパティにすることができます。ターゲットは依存関係プロパティでなければなりません。

私たちは皆、エラーを受け取ります!:)

ここに画像の説明を入力

ここですべてを説明します: http://blogs.msdn.com/b/jerrynixon/archive/2013/07/02/walkthrough-two-way-binding-inside-a-xaml-user-control.aspx

幸運を祈ります。

于 2013-08-02T18:03:07.713 に答える