有幾篇關於類似任務的文章。然而,似乎沒有人足夠接近我爲我所做的工作。我有一個自定義控件,它的模板中有一個ListBox。我根據自己的喜好重新設計了ListBox的模板。當選擇一個項目時,我想更改顏色。以下是我的問題似乎與大多數人分歧的部分:我不知道什麼顏色。它是呈現的項目中的任何顏色。我在XAML中綁定了不同的顏色,但在設置新顏色時不會重新繪製。我已經更改了項目中的默認顏色,以確保模板首先獲取正確的值。那成功了。我已經嘗試過的事情:綁定,使項目實現INotifyPropertyChanged和EventTrigger與故事板(從未真正建立我假設,因爲我的價值不是一個靜態資源)。我錯過了一些非常基本的東西。我確定。以下是摘錄的代碼,以幫助:WPF - ListBoxItem - 動態更改DataTemplate元素的顏色
XAML:
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="{Binding CurrentState.Border}" BorderThickness="1">
<TextBlock Text="{Binding DisplayObject}" Foreground="{Binding CurrentState.Foreground}" Background="{Binding CurrentState.Background}" MinHeight="12" MinWidth="50" Padding="2" ToolTip="{Binding ToolTip}"/>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
Helper類:
public class MultiStateSelectionGridState
{
public string Background { get; set; }
public string Foreground { get; set; }
public string Border { get; set; }
public string Text { get; set; }
public MultiStateSelectionGridState()
{
Background = "White";
Foreground = "Black";
Border = "Black";
Text = String.Empty;
}
};
public interface IMultiStateSelectionGridItem : INotifyPropertyChanged
{
object DisplayObject { get; }
object ToolTip { get; }
object Value { get; }
MultiStateSelectionGridState CurrentState { get; set; }
void OnPropertyChanged(PropertyChangedEventArgs e);
};
我不知道有多少項目類,我可以張貼的,所以我不會做所以最初。它看起來像以下雖然:
class SomeItem : IMultiStateSelectionGridItem
{
public int SomeInt { get; set; }
public string SomeString { get; set; }
public string SomeOtherString { get; set; }
public object DisplayObject
{
get { return SomeString + CurrentState.Text; }
}
public object ToolTip
{
get { return SomeOtherString; }
}
public object Value
{
get { return SomeInt; }
}
private MultiStateSelectionGridState m_currentState;
public MultiStateSelectionGridState CurrentState
{
get
{
return m_currentState;
}
set
{
m_currentState = value;
//Notice that this was just test code and I tried CurrentState, Background, and what
//you see there now.
OnPropertyChanged(new PropertyChangedEventArgs("CurrentState.Background"));
}
}
public SomeItem()
{
SomeInt = 0;
SomeString = String.Empty;
SomeOtherString = String.Empty;
CurrentState = new MultiStateSelectionGridState();
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
};
任何幫助將不勝感激。
首先,我不是在代碼隱藏中引用Colors的粉絲,而是選擇將它們保留在xaml中以達到我的最佳範圍。這對你來說甚至可以嗎?我是否正確猜測你只需要在選擇該項目時應用此動態顏色? – Viv 2013-04-26 08:41:59
如果我知道什麼顏色,那就很好。我試圖讓這非常靈活。最簡單的答案就是我在選擇時做了什麼。在我結束這個駝峯之後,我正在改變選擇的方式,但是我確實希望在選擇時改變顏色。可能值得注意的是,雖然我將顏色更改爲特定的顏色,但它只是一個佔位符,@Viv。 – BillyD 2013-04-26 12:52:07