星期二, 1月 22, 2008

[WPF]How can I get a ListBoxItem from a data bound ListBox?

天呀~~ 我長久以來的問題 居然在2005年就有人Blog回答這個問題

我卻渾然未知 一直在navigate visual tree來解決

Data會藉由Data Template展開始Visual Tree

這兩邊的Binding要如何互相串連呢? 這是很重要的問題

從Visual Tree串連到Data 我已經找到方法 就是直接看任何一個UIElement裡的DataContext

就會指到Data

但是如果從Data 想要得到展開Visual Tree的item怎麼辦呢?

原來就是下面這一行

GreekGod greekGod = (GreekGod)(listBox.Items[0]);

ListBoxItem lbi1 = (ListBoxItem)(listBox.ItemContainerGenerator.ContainerFromIndex(0));

from http://www.beacosta.com/blog/?p=7

[WPF] ItemsPanel, ItemsTemplate, DataTemplate, ControlTemplate? How to find ItemsPanel from code?

開始初學WPF對於Template其實是很容易一知半解 尤其是一大堆Template的名詞

與許多功能重複的關係 造成搞不清楚狀況

今天我跟同事們又解釋了一次 覺得其實我之前也花了許多時間搞懂 不如就寫下來

順便剛又找到一個問題的workaround解法 也寫下來記錄一下 .....

WPF主要是希望用XAML與Code 的方式 把User Interface與Logics分開

所以可以想到我們要寫一個Control的話......

所有的behavior, property是寫在Code裡

ControlTemplate (also can be defined in Style) 就是幫你把整個Custom Control的程式展開成Visual Tree,就是一大堆小元件,主要是Control 的Presentation....

ItemsTemplate 對於ItemsControl而言 就是將他的Items如何展開成Visual Tree....所以可想而知...ItemsTemplate是一種DataTemplates

DataTemplate 就是描述如何將Data (.net class)展開成Visual Tree (所以也就是我們assign source可以輕鬆地給.net data class,data template會為我們展開)

ItemsPanel就是對於一個ItemsControl而言 就是要去描述要如何layout所有的items,例如可以用StackPanel or WrapPanel.....


哈哈 這樣有比較清楚了嗎?..... 還有一個叫ContentTemplate

ItemsTemplate 之於ItemsControl 就等同於 ContentTemplate 之於 ContentControl
也就是描述如何將Content展開....


ok~~ 接下來是另一個問題 是我個人的經驗.....

何時要用Data Template,何時要用Custom Control,何時要用User Control

彈性而言 DataTemplate >> CustomControl >> UserControl

但是大家也知道 寫UI就是最容易東改西改 而且Control常混雜的很嚴重 也有可能很複雜

有時候很特別的一個UI 並不會需要有reuse的功能 我們可以直接用UserControl解決

但是如果是十分Common的Control 我們可以用CustomControl解決

DataTemplate則是如果能用現有的Control Composite成一個的話 就不需要花時間寫Control

大概是這樣 :D


最後一個問題 當ItemsPanel展開之後 我們沒辦法用Template.FindName找個ItemsPanel裡的Panel怎麼嗎?

我從google找到一個討論串 得enumerate Visual Tree解決 請享用

from http://www.msdner.net/dev-archive/210/153-119-2109609.shtm

private T FindItemsPanel(Visual visual)

{

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)

{

Visual child = VisualTreeHelper.GetChild(visual, i) as Visual;

if (child != null)

{

if (child is T && VisualTreeHelper.GetParent(child) is ItemsPresenter)

{

object temp = child;

return (T)temp;

}

T panel = FindItemsPanel(child);

if (panel != null)

{

object temp = panel;

return (T)temp; // return the panel up the call stack

}

}

}

return default(T);

}

星期五, 1月 18, 2008

UI與Logics可[WPF]以完全分離嗎? TemplatePart可以解決不能分離的部分

一直以來 寫WPF Custom Control會往UI與Style (ControlTemplate)作分離的假設實作

但是發現這太難了~~ 如果想要加一下比較特別的功能 或是 Usability

UI跟Logics其實是有隱含的共識與假設的........ 這部分TemplatePart就可以用來解決這方面的問題

可以參考以下這二個link

http://www.cnblogs.com/zhouyinhui/archive/2007/12/01/979715.html
http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!634.entry

怎麼寫呢? 例如 ( from 以上Link的Copy & Paste)

[TemplatePartAttribute(Name = "PART_EditableTextBox", Type = typeof(TextBox))]
[TemplatePartAttribute(Name
= "PART_Popup", Type = typeof(Popup))]
[LocalizabilityAttribute(LocalizationCategory.ComboBox)]
[StyleTypedPropertyAttribute(Property
= "ItemContainerStyle", StyleTargetType = typeof(ComboBoxItem))]
public class ComboBox : Selector


public override void OnApplyTemplate()
{
base.OnApplyTemplate();

Button mybtn
= base.GetTemplateChild("PART_BTN");

if (mybtn != null)
{
mybtn.Click
+= new RoutedEventHandler(mybtn_Click);
}

}

星期二, 1月 01, 2008

WPF Asynchronous DataBinding


一直以來 我想要寫一個Async DataBinding... 因為大量使用Data Binding 可能會影響整個UI的Performance

結果我找到這篇.... 唔... 是我誤會WPF... 其實是有Asynchronous Mode的...


Beatriz Costa » How can I control whether my Binding is synchronous or asynchronous?


另外還有一篇也很有意思 有關cross threading的操作.... 蠻值得參考的

Beatriz Costa » How can I propagate changes across threads?

[WPF] .netfx 3.5 IDataErrorInfo


.net 2.0的Databinding似乎有這個用法 但是.net 3.0沒有 所以特別在.net 3.5加入進來....

WPF 3.5 的IDataErrorInfo的用法 -- &gt;

WPF IDataErrorInfo and Databinding

Better WPF binding in .NET 3.5 « WPF Wonderland

Windows Presentation Foundation SDK : Data Validation in 3.5



Powered by ScribeFire.