C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: C# WPFのデータバインディング


(過去ログ 116 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■68489 / inTopicNo.1)  C# WPFのデータバインディング
  
□投稿者/ はなこさん (1回)-(2013/10/23(Wed) 09:37:56)

分類:[C#] 

VisualStudio2013 C# .NET4.5を使用してWPFの勉強をしています。

ボタンを押したタイミングで複数の引数をC#側のコードに渡して処理を行いたいのですが
データバインドがうまく出来ません。

具体的に言うと、
ボタンを押したタイミングで固定文字列と_textBox1.TextをC#側のコードに渡し
VisualStudioの出力ウインドウにWriteLineすると
固定文字列は正しく表示されますが、_textBox1.Textはnullになってしまいます。

もうひとつTextBoxを追加して
<TextBox Text="{Binding ElementName=_textBox1, Path=Text}"/>
とすると正しくバインドされるので書式自体は間違っていないと思うのですが…
どこが間違っているのでしょうか。

namespace WpfApplication4
{
    public class args : DependencyObject
    {
        public static readonly DependencyProperty arg1Property = DependencyProperty.Register("arg1", typeof(object), typeof(args));
        public static readonly DependencyProperty arg2Property = DependencyProperty.Register("arg2", typeof(object), typeof(args));
        public static readonly DependencyProperty arg3Property = DependencyProperty.Register("arg3", typeof(object), typeof(args));
        public static readonly DependencyProperty arg4Property = DependencyProperty.Register("arg4", typeof(object), typeof(args));

        public object arg1 { get { return (object)this.GetValue(arg1Property); } set { this.SetValue(arg1Property, value); } }
        public object arg2 { get { return (object)this.GetValue(arg2Property); } set { this.SetValue(arg2Property, value); } }
        public object arg3 { get { return (object)this.GetValue(arg3Property); } set { this.SetValue(arg3Property, value); } }
        public object arg4 { get { return (object)this.GetValue(arg4Property); } set { this.SetValue(arg4Property, value); } }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        public void ExecutedButton(object sender, ExecutedRoutedEventArgs e)
        {
            Func<object, string> tostring = (o) => (o == null) ? "null" : string.Format("\"{0}\"", o);
            var prm = (args)e.Parameter;
            Console.WriteLine("arg1={0}, arg2={1}, arg3={2}, arg4={3}", tostring(prm.arg1), tostring(prm.arg2), tostring(prm.arg3), tostring(prm.arg4));
        }
    }
}

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:winput="clr-namespace:System.Windows.Input;assembly=PresentationCore" 
        xmlns:local="clr-namespace:WpfApplication4"
        Title="MainWindow" Height="200" Width="200">

    <Window.Resources>
        <winput:RoutedCommand x:Key="routedCommandButton"/>
    </Window.Resources>

    <Window.CommandBindings>
        <CommandBinding
            Command="{StaticResource routedCommandButton}" 
            Executed="ExecutedButton"/>
    </Window.CommandBindings>

    <Grid>
        <TextBox Name="_textBox1" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" Text="ok1" VerticalAlignment="Top" Width="120"/>

        <Button Content="Button" HorizontalAlignment="Left" Margin="10,38,0,0" VerticalAlignment="Top" Width="75"
                Command="{Binding Mode=OneWay, Source={StaticResource routedCommandButton}}">
            <ButtonBase.CommandParameter>
                <local:args
                    arg1="{Binding ElementName=_textBox1, Path=Text}"
                    arg2="ok2"
                    arg3="ok3"/>
            </ButtonBase.CommandParameter>
        </Button>

    </Grid>
</Window>

引用返信 編集キー/
■68503 / inTopicNo.2)  Re[1]: C# WPFのデータバインディング
□投稿者/ Hongliang (110回)-(2013/10/24(Thu) 14:40:18)
XAMLロード時に作成される名前スコープ解決用のツリーに、DependencyObjectを直接継承するユーザ定義クラスは追加されないようです。
// 動作からの推測にすぎませんが。
local:argsオブジェクトがツリーに参加していないので、ElementNameに指定された_textBox1を検索するべくツリーを遡ろうとしても遡れず、_textBox1が見つけられないという状況です。

DependencyObjectから直接派生する代わりに、Freezableから派生するようにすると、名前スコープ解決用のツリーに参加させられるようになり、同一名前スコープの要素を見つけられます。
なお、Freezable派生クラスはいくつか実装上の要請があるので注意して下さい。
http://msdn.microsoft.com/ja-jp/library/ms750509.aspx
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -