Dependencyobject | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar dependencyobject

Windows Phone ekrandaki formu temizleme

12 August 2013 Yorum yapılmamış

Windows Phone için geliştirdiğiniz uygulamaya bir form eklediniz ve çok fazla giriş kutusu var (TextBox, PasswordBox, CheckBox, vs.)

Ekleyeceğiniz Temizle butonu aracılığıyla ekrandaki tüm giriş kutularını temizlemek istiyorsunuz. Page şablonunun varsayılan halinde yeralan LayoutRoot isimli Grid üzerinden temizleme yapabilirsiniz;

foreach (var element in LayoutRoot.Children)
{
	if (element is TextBox)
	{
		(element as TextBox).Text = "";
	}
}

Fakat tasarımına uymamasından dolayı LayoutRoot isimli Grid ekranda olmayabilir ve daha genel bir yöntemle tüm giriş kutularını temizlemek isteyebilirsiniz.

Aşağıdaki gibi bir kendini çağıran fonksiyon (recursive function) aracılığıyla bu işi yaptırabilirsiniz;

private void ClearTextbox(DependencyObject element)
{
	var elementChildCount = VisualTreeHelper.GetChildrenCount(element);

	if (elementChildCount > 0)
	{
		for (var iLoop = 0; iLoop < elementChildCount; iLoop++)
		{
			var innerElement = VisualTreeHelper.GetChild(element, iLoop);

			if (innerElement is TextBox)
			{
				(innerElement as TextBox).Text = "";
			}
			else
			{
				ClearTextbox(innerElement);
			}
		}
	}
}

VisualTreeHelper sınıfının static GetChildrenCount() methodu ile ilgili nesnenin içinde başka bir nesne olup olmadığını kontrol ediyoruz, eğer nesne başka nesne içeriyorsa, döngü aracılığı ile dönerek GetChild() methodu sayesinde her elemanı buluyoruz.

Bulduğumuz nesne eğer bir TextBox ise, basitçe Text özelliğini boşaltıyoruz, değilse fonksiyonu tekrar çağırıp elde ettiğimiz nesneyi veriyoruz. Böylece her nesnenin içerdiği elemanları teker teker bulup içeriklerini temizleyebiliyoruz.

Kullanmak için;

private void TemizleButton_OnClick(object sender, RoutedEventArgs e)
{
	ClearTextbox(this);
}

C# CallerMemberName attribute

12 February 2013 Yorum yapılmamış

.Net 4.5 ve C# 5 ile duyurulan CallerMemberName attribute’unun Loglama ve OnPropertyChanged method’unu daha kolay tetiklemek dışında ne işe yarayacağını uzun süre düşündükten sonra, internette gördüğüm bir makale ile aklıma bir fikir geldi. CallerMemberName attribute‘unun kullanım alanlarını inceleyelim;

Loglama

public static void LogException(string message,
	[CallerMemberName] string callerName = null,
	[CallerLineNumber] int lineNumber = 0,
	[CallerFilePath] string filePath = null)
{
	Console.WriteLine("Hata oluştu : {0}. Method : {1} Satır : {2} Dosya : {3}", message, callerName, lineNumber, filePath);
}

private static void Calculate()
{
	try
	{
		/// Veritabanına bağlan, sorgulama yap, hesapla
	}
	catch (Exception ex)
	{
		LogException(ex.Message);
	}
}

OnPropertyChanged

OnPropertyChanged method’unu C# 5‘ten önce şöyle tetikleriz;

protected virtual void OnPropertyChanged(string propertyName)
{
	PropertyChangedEventHandler handler = PropertyChanged;
	if (handler != null)
	{
		handler(this, new PropertyChangedEventArgs(propertyName));
	}
}

private string _productName;
public string ProductName
{
	get { return _productName; }
	set
	{
		_productName = value;
		OnPropertyChanged("ProductName");
	}
}

C# 5 ile birlikte gelen CallerMemberName attribute’unu kullanarak aynı işi şu şekilde yapabiliriz;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
	PropertyChangedEventHandler handler = PropertyChanged;
	if (handler != null)
	{
		handler(this, new PropertyChangedEventArgs(propertyName));
	}
}
 
private string _productName;
public string ProductName
{
	get { return _productName; }
	set
	{
		_productName = value;
		OnPropertyChanged();
	}
}

Strategy Pattern

CallerMemberName attribute‘unun yukarıdakilerden farklı kullanımı aşağıdaki gibi olabilir;

public class CustomSerializer
{
	public Func<string> Serialize { get; private set; }

	public CustomSerializer([CallerMemberName] string memberName = "")
	{
		if (memberName.Contains("Xml"))
		{
			Serialize = () => { return "xml"; };
		}
		else
		{
			Serialize = () => { return "json"; };
		}
	}
}

public static void WriteXml()
{
	var serializer = new CustomSerializer();
	Console.WriteLine(serializer.Serialize()); /// xml
}

public static void WriteJson()
{
	var serializer = new CustomSerializer();
	Console.WriteLine(serializer.Serialize()); /// json
}

Böylece, CustomSerializer class’ında bulunan Serialize method’unu çağıran method’un adında Xml anahtar kelimesi varsa Serialize method’u xml serialization yapacak, yoksa json serialization yapacak.

Kaynak : Makaleyi tekrar bulamadım :(