【问题标题】:WPF User Control with Dependency Property not working具有依赖属性的 WPF 用户控件不起作用
【发布时间】:2016-03-01 21:37:27
【问题描述】:

我正在编写一个 WPF 应用程序,并且有一个用户控件,其中包含我想在多个地方使用的几个数据网格。在每个地方,我希望字体大小不同。

这是我正在尝试的:

.xaml:

<UserControl x:Class="RoviPutt.Controls.Leaderboard"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="605" d:DesignWidth="890">
    <UserControl.Resources>
        <Style TargetType="{x:Type DataGrid}" BasedOn="{StaticResource MetroDataGrid}">
            <Setter Property="FontSize" Value="{Binding TextSize}"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <ma:FlipView IsBannerEnabled="False">
            <ma:FlipView.Items>
                <Grid>
                    <DataGrid ItemsSource="{Binding ShowOverall.Leaders}" Margin="50" BorderThickness="2">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="RANK" Binding="{Binding Rank}" Width="Auto"/>
                            <DataGridTextColumn Header="NAME" Binding="{Binding Name}" Width="*"/>
                            <DataGridTextColumn Header="COMPANY" Binding="{Binding Company}" Width="*"/>
                            <DataGridTextColumn Header="SCORE" Binding="{Binding Score, StringFormat=N2}" Width="Auto"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
                <Grid>
                    <DataGrid ItemsSource="{Binding SessionOverall.Leaders}" Margin="50" BorderThickness="2">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="RANK" Binding="{Binding Rank}" Width="Auto"/>
                            <DataGridTextColumn Header="NAME" Binding="{Binding Name}" Width="*"/>
                            <DataGridTextColumn Header="COMPANY" Binding="{Binding Company}" Width="*"/>
                            <DataGridTextColumn Header="SCORE" Binding="{Binding Score, StringFormat=N2}" Width="Auto"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
            </ma:FlipView.Items>
        </ma:FlipView>
    </Grid>
</UserControl>

.xaml.cs:

public partial class Leaderboard : UserControl
{
    public Leaderboard()
    {
        InitializeComponent();
        var vm = new LeaderboardViewModel();
        vm.TextSize = TextSize;
        DataContext = vm;
    }

    #region Dependency Properties

    public int TextSize
    {
        get { return (int)GetValue(TextSizeProperty); }
        set { SetValue(TextSizeProperty, value); }
    }

    public static readonly DependencyProperty TextSizeProperty =
        DependencyProperty.Register("TextSize", typeof(int),
          typeof(Leaderboard));

    #endregion
}

视图模型:

public class LeaderboardViewModel : BindableBase
{
    public LeaderboardViewModel()
    {

    }

    #region Properties

    /// <summary>
    /// Font size
    /// </summary>
    private int textSize;
    public int TextSize
    {
        get { return textSize; }
        set { SetProperty(ref textSize, value); }
    }

    /// <summary>
    /// Show overall game score leaderboard
    /// </summary>
    private Leaderboard showOverall;
    public Leaderboard ShowOverall
    {
        get { return showOverall; }
        set { SetProperty(ref showOverall, value); }
    }

    /// <summary>
    /// Session overall game score leaderboard
    /// </summary>
    private Leaderboard sessionOverall;
    public Leaderboard SessionOverall
    {
        get { return sessionOverall; }
        set { SetProperty(ref sessionOverall, value); }
    }

    #endregion
}

每次我设置 TestSize 属性时使用

<Leaderboard TextSize="20"/>

并检查 .xaml.cs,我得到的 TextSize 为 0。知道我做错了什么吗?

【问题讨论】:

    标签: c# wpf user-controls dependency-properties


    【解决方案1】:

    我假设绑定试图在 DataContext 这是视图模型中找到 TextSize 属性,而不是在 UserControl 自己的属性中。

    尝试为您的UserControl 命名:

    <UserControl .... x:Name="leaderBoard">
    

    并将绑定更改为以下内容:

    <Setter Property="FontSize" Value="{Binding TextSize, ElementName=leaderBoard}"/>
    

    当您遇到绑定问题时,请始终检查 Visual Studio 的“输出”窗格。绑定错误应在此处列出,并提示您可能出现的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      相关资源
      最近更新 更多