2017-07-07 31 views
-2

(我使用WPF和MVVM模式)在項目控制自定義按鈕繼承,內容沒有被設置

首先,我從Button控件創建自己的自定義按鈕繼承。這是因爲我想這個按鈕有一些附加屬性:

public class RangeButton : Button 
{ 
    public Rank CardARank { get; set; } 
    public Rank CardBRank { get; set; } 
    public bool IsSuited { get; set; } 
    public string ButtonContent { get; set; } 

    public RangeButton(int i, int j, bool suited) 
    { 
     CardARank = GetRankFromInt(i); 
     CardBRank = GetRankFromInt(j); 
     IsSuited = suited; 
     SetButtonContent(); 
    } 

    public RangeButton() 
    { 
    } 

    private Rank GetRankFromInt(int x) 
    { 
     return (Rank) x; 
    } 

    private void SetButtonContent() 
    { 
     ButtonContent = StaticGameHelpers.GetRangeSegmentString(CardARank, CardBRank, IsSuited); 
    } 
} 

我初始化RangeButton的名單在我的視圖模型,每一個它的屬性被設置正確 - 我最終的169個RangeButtons列表:

public List<RangeButton> RangeButtons 
    { 
     get { return _rangeButtons; } 
     set 
     { 
      _rangeButtons = value; 
      OnPropertyChanged("RangeButtons"); 
     } 
    } 

這是我的XAML:正在顯示

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding RangeButtons}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <inheritedControls:RangeButton Width="70" Height="50" Margin="3"> 
        <ContentPresenter Content="{Binding ButtonContent, RelativeSource={RelativeSource Self}}"/> 
       </inheritedControls:RangeButton> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Columns="13" Rows="13"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

全部169按鈕,但每個按鈕是完全空白,沒有內容。此外,寬度,高度和邊距的特性被忽略,這導致我相信我的xaml存在問題,但我無法弄清楚。

我意識到有這樣一些類似的問題,但沒有一個使用自定義繼承按鈕。任何幫助非常感謝:)

+2

如果您正在初始化視圖模型中的RangeButton列表,那麼它不再是MVVM。根據MVVM,視圖模型不應該意識到視圖。儘管你迫使視圖模型包含一些視圖項目(按鈕)。 – dymanoid

+0

您是否嘗試過使用'ObservableCollection'或'ConcurrentBag'作爲您的列表?這可能是爲什麼它不會令人耳目一新,它綁定到一個簡單的舊List List。只是一個猜測:) –

+0

@dymanoid啊是的,你是對的 - 謝謝你指出。你認爲更好的方法是在我的虛擬機中有一個自定義對象列表,例如列表,它將包含與我的RangeButton相同的屬性 - 然後在我的xaml中使用這個作爲項目源,但是將每個項目重新模板爲按鈕? – rejy11

回答

1

感謝來自@dymanoid的一些建議,我採取了不同的方法。我放棄了從按鈕控制想法中繼承的全部內容,並簡單地創建了一個自定義對象'RangeSegment',它可以替代我的RangeButton失敗。在我的VM中,我存儲了一個RangeSegments列表,並將它們用作ItemsControl的ItemsSource。然後在每個項目的Datatemplate中,我添加了一個Button,其內容屬性綁定了每個RangeSegment中的屬性。