毎回忘れる細かい書式
・.Resource内での宣言
<.Resource>
<DataTemplate DataType="{x:Type [namespace]:[class]}" />
</.Resource>
・ListBoxへのBinding
要素が1つなら
<ListBox ItemsSource="{Binding [List]}" DisplayMemberPath="[Listの要素]"/>
要素が複数かつ色々変えるなら
<ListBox ItemsSource="{Binding [List]}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding [要素1]}"/>
<TextBlock Text="{Binding [要素2]}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
選択できなくて良いなら
<ItemsControl ItemsSource="{Binding [List]}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="LightPink" CornerRadius="20">
<TextBlock Margin="1">
<!--Run Text="要素1 : " FontSize="10"/-->
<Run Text="{Binding [要素1]}" FontSize="10"/>
<LineBreak/>
<Run Text="要素2 : "/>
<Run Text="{Binding [要素2]}"/>
</TextBlock>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
・PropertyChangedの通知
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
2016年3月8日火曜日
PasswordBoxでデータバインド
【参考】http://garafu.blogspot.jp/2014/09/wcf-passwordbox.html
セキュリティの問題から基本的には非推奨
-----------------------
利用方法
<PasswordBox [namespace]:PasswordBoxHelper.Password = {Binding Target}/>
------------------------
【PasswordBoxHelper.cs】
セキュリティの問題から基本的には非推奨
-----------------------
利用方法
<PasswordBox [namespace]:PasswordBoxHelper.Password = {Binding Target}/>
------------------------
【PasswordBoxHelper.cs】
namespace WpfPasswordBox{ using System.Windows; using System.Windows.Controls; public class PasswordBoxHelper : DependencyObject { public static readonly DependencyProperty IsAttachedProperty = DependencyProperty.RegisterAttached( "IsAttached", typeof(bool), typeof(PasswordBoxHelper), new FrameworkPropertyMetadata(false, PasswordBoxHelper.IsAttachedProperty_Changed)); public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached( "Password", typeof(string), typeof(PasswordBoxHelper), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, PasswordBoxHelper.PasswordProperty_Changed)); public static bool GetIsAttached(DependencyObject dp) { return (bool)dp.GetValue(PasswordBoxHelper.IsAttachedProperty); } public static string GetPassword(DependencyObject dp) { return (string)dp.GetValue(PasswordBoxHelper.PasswordProperty); } public static void SetIsAttached(DependencyObject dp, bool value) { dp.SetValue(PasswordBoxHelper.IsAttachedProperty, value); } public static void SetPassword(DependencyObject dp, string value) { dp.SetValue(PasswordBoxHelper.PasswordProperty, value); } private static void IsAttachedProperty_Changed(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var passwordBox = sender as PasswordBox; if ((bool)e.OldValue) { passwordBox.PasswordChanged -= PasswordBoxHelper.PasswordBox_PasswordChanged; } if ((bool)e.NewValue) { passwordBox.PasswordChanged += PasswordBoxHelper.PasswordBox_PasswordChanged; } } private static void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e) { var passwordBox = sender as PasswordBox; PasswordBoxHelper.SetPassword(passwordBox, passwordBox.Password); } private static void PasswordProperty_Changed(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var passwordBox = sender as PasswordBox; var newPassword = (string)e.NewValue; if (!GetIsAttached(passwordBox)) { SetIsAttached(passwordBox, true); } if ((string.IsNullOrEmpty(passwordBox.Password) && string.IsNullOrEmpty(newPassword)) || passwordBox.Password == newPassword) { return; } passwordBox.PasswordChanged -= PasswordBoxHelper.PasswordBox_PasswordChanged; passwordBox.Password = newPassword; passwordBox.PasswordChanged += PasswordBoxHelper.PasswordBox_PasswordChanged; } }}2016年2月29日月曜日
ViewModelBaseの代替?
【参考】http://zecl.hatenablog.com/entry/20091211/p1
【IImpleNotifyPropertyChanged.cs】
【IImpleNotifyPropertyChanged.cs】
using System; using System.Linq; using System.Linq.Expressions; using System.ComponentModel; namespace ClassLibrary1 { /// <summary> /// IImpleNotifyPropertyChangedインターフェイス /// /// INotifyPropertyChangedの実装をある程度抽象化し、簡易な実装を提供します。 /// </summary> public interface IImpleNotifyPropertyChanged : INotifyPropertyChanged { /// <summary> /// PropertyChangedの再定義 /// (INotifyPropertyChangedのPropertyChangedを隠蔽する) /// </summary> new event PropertyChangedEventHandler PropertyChanged; /// <summary> /// PropertyChangedEventHandlerを取得します。 /// </summary> PropertyChangedEventHandler PropertyChangedHandler { get; } } /// <summary> /// IImpleNotifyPropertyChangedインターフェイスについて拡張メソッド提供 /// </summary> public static class IImpleNotifyPropertyChangedExtentions { /// <summary> /// プロパティの変更を通知します。 /// </summary> /// <param name="self">対象</param> /// <param name="targets">プロパティ変更通知対象の名称群</param> private static void OnPropertyChanged<TObject>(this TObject self, params string[] propertyNames) where TObject : IImpleNotifyPropertyChanged { if (self == null) return; if (self.PropertyChangedHandler == null) return; foreach (var propertyName in propertyNames) self.PropertyChangedHandler(self, new PropertyChangedEventArgs(propertyName)); } /// <summary> /// プロパティの変更を通知します。 /// </summary> /// <typeparam name="TObject"></typeparam> /// <typeparam name="TExpression"></typeparam> /// <param name="self">対象</param> /// <param name="expressions">プロパティ変更通知対象の名称を取得するExpression群</param> public static void OnPropertyChanged<TObject, TExpression>(this TObject self, params Expression<Func<TObject, TExpression>>[] expressions) where TObject : IImpleNotifyPropertyChanged { var propertyNames = from e in expressions select ((MemberExpression)e.Body).Member.Name; self.OnPropertyChanged(propertyNames.ToArray()); } } /// <summary> /// INotifyPropertyChangedインターフェイスについて拡張メソッドを提供 /// </summary> public static class INotifyPropertyChangedExtentions { /// <summary> /// プロパティ変更イベントの関連付け補助 /// </summary> /// <typeparam name="TObject"></typeparam> /// <typeparam name="TExpression"></typeparam> /// <param name="self"></param> /// <param name="expressions"></param> /// <param name="handler"></param> public static void AddPropertyChanged<TObject, TExpression>(this TObject self, Expression<Func<TObject, TExpression>> expressions, Action<TObject> handler) where TObject : INotifyPropertyChanged { if (self == null) return; var propName = ((MemberExpression)expressions.Body).Member.Name; self.PropertyChanged += (sender, e) => { if (e.PropertyName == propName) handler(self); }; } } }
RelayCommand.cs
【参考】http://d.hatena.ne.jp/kaorun/20141202/1417532472
ICommandの簡単実装
--------------------------
ViewModel内で宣言
・宣言
public ICommand Event_name { get; set; }
・コンストラクタで初期化
Event_name = new RelayCommand( Process_name );
・実処理は別に作成(簡単な処理ならlambdaで)
public void Process_name(){
処理内容;
(例:インクリメント、メッセージボックス表示)
}
--------------------------
Common内で定義
【RelayCommand.cs】
using System;
using System.Windows.Input;
namespace Project.Common
{
public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;
public event EventHandler CanExecuteChanged;
public RelayCommand(Action execute) : this(execute, null)
{
}
public RelayCommand(Action execute, Func<bool> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute();
}
public void Execute(object parameter)
{
_execute();
}
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
}
ICommandの簡単実装
--------------------------
ViewModel内で宣言
・宣言
public ICommand Event_name { get; set; }
・コンストラクタで初期化
Event_name = new RelayCommand( Process_name );
・実処理は別に作成(簡単な処理ならlambdaで)
public void Process_name(){
処理内容;
(例:インクリメント、メッセージボックス表示)
}
--------------------------
Common内で定義
【RelayCommand.cs】
using System;
using System.Windows.Input;
namespace Project.Common
{
public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;
public event EventHandler CanExecuteChanged;
public RelayCommand(Action execute) : this(execute, null)
{
}
public RelayCommand(Action execute, Func<bool> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute();
}
public void Execute(object parameter)
{
_execute();
}
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
}
登録:
投稿 (Atom)