2013-04-25 70 views
0

有幾篇關於類似任務的文章。然而,似乎沒有人足夠接近我爲我所做的工作。我有一個自定義控件,它的模板中有一個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); 
    } 
}; 

任何幫助將不勝感激。

+0

首先,我不是在代碼隱藏中引用Colors的粉絲,而是選擇將它們保留在xaml中以達到我的最佳範圍。這對你來說甚至可以嗎?我是否正確猜測你只需要在選擇該項目時應用此動態顏色? – Viv 2013-04-26 08:41:59

+0

如果我知道什麼顏色,那就很好。我試圖讓這非常靈活。最簡單的答案就是我在選擇時做了什麼。在我結束這個駝峯之後,我正在改變選擇的方式,但是我確實希望在選擇時改變顏色。可能值得注意的是,雖然我將顏色更改爲特定的顏色,但它只是一個佔位符,@Viv。 – BillyD 2013-04-26 12:52:07

回答

0

確定您在SomeItem實施INPC而不是MultiStateSelectionGridState所以當你切換狀態,你需要非常創建一個新的CurrentState對象不是去像CurrentState.Background = "Blue";代碼隱藏

您還需要切換

OnPropertyChanged(new PropertyChangedEventArgs("CurrentState.Background")); 

OnPropertyChanged(new PropertyChangedEventArgs("CurrentState")); 

現在,當您切換CurrentState變量(當選擇項目時)它將傳播到視圖,它的屬性將被相應地查詢。

我做類似測試的:

Items = new ObservableCollection<SomeItem> { 
    new SomeItem { 
    CurrentState = new MultiStateSelectionGridState() 
    } 
}; 

// Simulating a Selected State change 
var tempTask = new Task 
    (
() => { 
    Thread.Sleep(5000); 
    Items[0].CurrentState = new MultiStateSelectionGridState { 
     Background = "Green", 
     Border = "Blue" 
    }; 
    }, 
    TaskCreationOptions.LongRunning 
); 
tempTask.Start(); 

,並具有ListBox有它的ItemsSource作爲Items從上面。

你可以找到這個Here

工作的例子如果你不想繼續再創建狀態變化CurrentState對象,使 MultiStateSelectionGridState實施INPC本身。

側面說明

我不知道在哪裏,當你真正瞭解,爲控制設置什麼顏色,所以提醒着如何移動到XAML。但你應該看看這些來自xaml

+0

我現在可以大聲叫嚷了。我知道這會很簡單。它現在有效。謝謝您的幫助! – BillyD 2013-04-26 13:58:16