XAML 是否有方法将Item/DataTemplate注入到自定义Style或UserControl中?

dm7nw8vv  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(118)

读取解决方案的更新

我有一个小的WPF应用程序与几个小游戏克隆,如扫雷,连接4,井字游戏等。
所有这些的共同点是它们都是一个均匀的方格网格,每个方格都由一个按钮控制。
对于这些游戏中的每一个,我都在它们的XAML中定义了一个带有UniformGridItemsPanelTemplate的UserControl。
它们唯一不同的地方是使用的DataTemplate:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <!-- Button that fit the specific need of the game -->
    </DataTemplate>           
</ItemsControl.ItemTemplate>

为了避免重复,我希望创建一个具有DataTemplate依赖属性的UserControl(并且在XAML中定义了一个名为itemscontrol的ItemsControl):

public DataTemplate DataTemplate
{
    get => (DataTemplate)GetValue(DataTemplateProperty);
    set => SetValue(DataTemplateProperty, value);
}
public static readonly DependencyProperty DataTemplateProperty =
        DependencyProperty.Register("DataTemplate", typeof(DataTemplate), typeof(BoardGameControl));

public BoardGameControl()
{
    InitializeComponent();
    itemscontrol.ItemTemplate = DataTemplate;
}

我试着在我的应用程序中这样使用它:

<controls:BoardGameControl>
    <controls:BoardGameControl.DataTemplate>
        <DataTemplate>
            <Button Content="Hi"/>
        </DataTemplate>
    </controls:BoardGameControl.DataTemplate>
</controls:BoardGameControl>

我也尝试过其他一些方法,但都没有成功。
如何避免为每个游戏定义一个新的ItemsControl,而使用一个UserControl或Style,根据情况接受不同的Button?

更新

我将标记为已接受的解决方案和@Joe对该帖子的评论结合起来。
我创建了一个带有所需属性的自定义控件(而不是UserControl),然后根据自己的喜好在Generic.xaml文件中设置样式。我还从自定义控件中删除了DataTemplate属性,并在App.xaml中为每个不同的VM添加了DataTemplates。
下面你会发现我的新自定义控件的代码和风格。
第一个
请注意,我总是将ItemsSource绑定到Squares,我能够做到这一点,因为我所有的游戏都有一个名为Squares的ObservableCollection,其中存储了方形视图模型。
数据模板示例

<DataTemplate DataType="{x:Type mvvmtoolkit:MemorySquareVM}">
        <Button Command="{Binding RelativeSource={RelativeSource AncestorType=controls:GameBoardControl}, Path=DataContext.PressSquareCommand}" 
                CommandParameter="{Binding}"
                Background="{Binding Position, Converter={local:PositionToColorConverter}}"
                Style="{StaticResource MemoryButton}"/>
</DataTemplate>
0aydgbwb

0aydgbwb1#

如果我正确地理解了您的需求,那么您需要稍微更改一下实现:您不应该在程式码后置中使用值指派,而是需要在XAML中使用系结。
第一个
我还强烈建议在这种情况下(当属性被添加到元素时,它的行为被更改,等等)不要使用UserControl,而使用Custom Control。
为什么我的实现不起作用?
在Sharp上实施:

public static readonly DependencyProperty DataTemplateProperty =
        DependencyProperty.Register("DataTemplate", typeof(DataTemplate), typeof(BoardGameControl),
         new PropertyMetadata((d, e) => ((BoardGameControl)d).itemscontrol.ItemTemplate = (IEnumerable) e.NewValue));

public BoardGameControl()
{
    InitializeComponent();
    // itemscontrol.ItemTemplate = DataTemplate;
}

我想创建一个自定义控件,但是我自己不知道如何实现ItemsControl / UniformGrid的逻辑
如果您在Studio工作,然后在上下文菜单中选择“添加”-〉“创建元素”。一个组合框将出现,并从中选择“自定义控件WPF”。您将拥有一个从控件派生的类代码。向它添加您需要的属性和行为逻辑。并且“Themes/Generic.xaml”文件也将被创建-这是默认主题。此主题将为您的元素提供一个模板-请根据需要对其进行编辑。

相关问题