C# items控件中的自定义继承按钮,未设置内容

C# items控件中的自定义继承按钮,未设置内容,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,(我正在使用WPF和MVVM模式) 首先,我继承了Button控件来创建自己的自定义按钮。这是因为我希望此按钮具有一些附加属性: public class RangeButton : Button { public Rank CardARank { get; set; } public Rank CardBRank { get; set; } public bool IsSuited { get; set; } public string ButtonConten

(我正在使用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个RangeButton的列表:

public List<RangeButton> RangeButtons
    {
        get { return _rangeButtons; }
        set
        {
            _rangeButtons = value;
            OnPropertyChanged("RangeButtons");
        }
    }
公共列表范围按钮
{
获取{return\u rangeButtons;}
设置
{
_范围按钮=值;
OnPropertyChanged(“范围按钮”);
}
}
这是我的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存在问题,但我无法完全理解


我意识到有一些类似的问题是这样问的,但没有一个是使用自定义继承按钮。非常感谢任何帮助:)

感谢@dymanoid的建议,我采取了不同的方法。我放弃了从按钮控制思想继承下来的全部内容,只是创建了一个自定义对象“RangeSegment”,它将取代我的RangeButton失败。在我的VM中,我存储了一个范围段列表,并将其用作ItemsControl的ItemsSource。然后在每个项目的Datatemplate中,我添加了一个按钮,内容属性绑定了每个RangeSecgment中的属性

如果您在视图模型中初始化RangeButtons列表,那么它就不再是MVVM了。根据MVVM,视图模型不应该知道视图。尽管您正在强制视图模型包含一些视图项(按钮)。您是否尝试过在列表中使用
observeCollection
ConcurrentBag
?这可能就是它不刷新的原因,它绑定到一个简单的旧
列表
。只是一个猜测:)@dymanoid啊,是的,你是对的-谢谢你指出这一点。你认为更好的方法是在我的虚拟机中有一个自定义对象列表,比如List,它将包含与RangeButton相同的属性,然后在我的xaml中使用它作为项目源,但将每个项目重新模板化为一个按钮吗?这是正确的方向。我怀疑您是否需要将
按钮子类化。您可以在XAML中应用
ControlTemplate
,也可以使用附加属性(在自定义类中)。@DanRayson刚刚尝试过,但没有成功。我想我需要一个全新的方法,正如dymanoid所指出的