2013年01月18日

[C# WPF]Binding Sourceプロパティを使う

今回はBinding Sourceプロパティを使ってみます。

Binding SourceプロパティはDataContextとは別の
オブジェクトのメンバをBindする場合に使用します。

サンプルを見てみます。

[xaml]

<Grid>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBox Text="{Binding Text, Source={x:Static local:TestClass.Object}}" Width="70" Height="23" Margin="5"/>
<Button Content="Button" Height="23" Margin="5" Click="Button_Click"/>
</StackPanel>
</Grid>


[ソース]

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

this.DataContext = this;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(TestClass.Object.Text);
}
}

public class TestClass
{
private static TestClass obj = new TestClass();
public static TestClass Object { get { return obj; } }

public string Text { get; set; }

private TestClass()
{
}
}


TestClassのシングルトンオブジェクトのプロパティをBindしています。
xamlのDataContextはMainWindowクラスオブジェクトなので
BindingのSourceにTestClassのオブジェクトを指定してBindしています。
このようにソースのstaticオブジェクトをBindする時は{x:Static オブジェクト}と記述します。

アプリ設定をシングルトンオブジェクトで管理している場合などに
そのオブジェクトのプロパティをBindする時に使います。

実行結果です。
1.jpg

TextBoxに入力してButtonを押すと入力した内容がMessageBoxに表示されます。
Staticに指定したオブジェクトのプロパティに設定されている事がわかります。


posted by cw at 13:30| Comment(1) | Binding | このブログの読者になる | 更新情報をチェックする

[C# WPF]Binding Converterプロパティを使う

今回はConverterを使用します。
ConverterはBindingソースと表示形式の間で変換が必要な時に使用します。

今回作成するサンプルではint型の数値を16進数文字列形式で表示します。

サンプルを見てみましょう。

xamlです。

<Window.Resources>
<local:HexConverter x:Key="HexConv"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"
Width="70" Height="23" Margin="5"
HorizontalAlignment="Left" VerticalAlignment="Top"/>
<TextBlock Text="{Binding Value, Converter={StaticResource HexConv}}"
Grid.Row="1" Width="70" Height="23" Margin="5"
HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>


赤字の部分を見てください。
csコードで実装しているHexConverterをリソース登録しています。
そしてTextBlockのTextプロパティのBindingでConverterを設定しています。
このサンプルはTextBoxに入力した値をTextBlockに16進数形式で表示します。

次にcsソースです。

public partial class MainWindow : Window, INotifyPropertyChanged
{
private int val;
public int Value
{
get { return val; }
set
{
val = value;
OnPropertyChanged("Value");
}
}

public MainWindow()
{
InitializeComponent();

this.DataContext = this;
}

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}

public class HexConverter : IValueConverter
{
public object Convert(object value, Type type, object parameter, CultureInfo culture)
{
int v = (int)value;
return string.Format("0x{0:X2}", v);
}

public object ConvertBack(object value, Type type, object parameter, CultureInfo culture)
{
string s = (string)value;
int v;
if (int.TryParse(s, NumberStyles.AllowHexSpecifier, null, out v))
{
return v;
}
return 0;
}
}



HexConverterを定義しています。
BindingConverterに指定するクラスはIValueConverterを実装します。
IValueConverterはConvertとConvertBackの2つのメソッドを持ちます。
ConvertがBindingソースからコントロールへのデータの受け渡し時に呼び出される変換
ConvertBackがその逆の際に呼び出される変換です。
サンプルのHexConverterはint型の数値データを16進数形式の文字列に変換します。

実行してみましょう。
1.jpg
TextBoxに値を入力するとTextBlockに16進数形式にして表示します。

このConverterの機構もビジネスロジックと表示処理を分離する為に欠かせない機能です。
BooleanToVisibilityConverter等標準で用意されているConverterもあります。
posted by cw at 12:30| Comment(0) | Binding | このブログの読者になる | 更新情報をチェックする

[C# WPF]Binding ConverterParameterプロパティを使う

今回はConverterParameterプロパティを使用してみます。
前回紹介したConverterにパラメータを渡す事ができます。
BindingのConverterParameterプロパティを設定します。

サンプルは前回のものに少し手を加えて使います。
では見てみましょう。

<Window.Resources>
<local:HexConverter x:Key="HexConv"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"
Width="70" Height="23" Margin="5"
HorizontalAlignment="Left" VerticalAlignment="Top"/>
<TextBlock Text="{Binding Value, Converter={StaticResource HexConv}, ConverterParameter=4}"
Grid.Row="1" Width="70" Height="23" Margin="5"
HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>


赤字部分でConverterParameterを指定しています。
今回のサンプルは16進数表記の桁数をパラメータで指定します。

Converterのソースです。

public class HexConverter : IValueConverter
{
public object Convert(object value, Type type, object parameter, CultureInfo culture)
{
int v = (int)value;
int p = int.Parse((string)parameter);
return string.Format("0x{0:X" + p.ToString() + "}", v);
}

public object ConvertBack(object value, Type type, object parameter, CultureInfo culture)
{
string s = (string)value;
int v;
if (int.TryParse(s, NumberStyles.AllowHexSpecifier, null, out v))
{
return v;
}
return 0;
}
}


xamlのConverterParameterで指定したパラメータは第三引数のparameterに入ります。
パラメータは文字列形式なのでParseしています。

実行してみます。
1.jpg

パラメータに4を設定しているので16進数表記4桁で表示されます。

ConverterParameterもBindingして動的に変更できればいいのですが
それができないのであまり使えません。
posted by cw at 12:00| Comment(0) | Binding | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。