【问题标题】:WPF - Binding Datagrid Items.Count to Custom Controls LabelWPF - 将 Datagrid Items.Count 绑定到自定义控件标签
【发布时间】:2010-11-11 18:01:11
【问题描述】:

我是 wpf 的新手,并尝试将静态定义的 DataGrid 的 Items.Count 属性绑定到我的自定义控件的标签。

我当前的实现如下所示。但是标签保持空白:I

定义 DataGrid 的类:

public class BindingNavigator : Control
{
    private static DataGrid dataGrid;

    static BindingNavigator()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(BindingNavigator), new FrameworkPropertyMetadata(typeof(BindingNavigator)));
    }

    public DataGrid DataGrid
    {
        set { dataGrid = value; }
        get { return dataGrid; }
    }
}

要在标签中显示 Items.Count 的 CustomControl 的 XAML

<Style TargetType="{x:Type local:BindingNavigator}">
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:BindingNavigator}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid MinWidth="210" MinHeight="50">
                        <Label Width="30" Height="30" Content="{Binding ElementName=DataGrid, Path=Items.Count}" />
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我在其中部署自定义控件的 XAML

    <DataGrid Name="dataGrid1" VerticalAlignment="Top" Width="210">
        <DataGrid.Columns>
            <DataGridTextColumn Header="header" />
        </DataGrid.Columns>
    </DataGrid>
    <my:BindingNavigator Name="bindingNavigator1" />
</Grid>

我填充网格并设置自定义控件的 DataGrid 属性的 EventHandler 背后的代码

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        dataGrid1.Items.Add("1");
        dataGrid1.Items.Add("2");

        bindingNavigator1.DataGrid = dataGrid1;
    }

为什么我不能将 Items.Count 属性绑定到标签?

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    您只需将 ElementName 的值更改为 DataGrid 的实际名称(即 dataGrid1 而不是 DataGrid)。

        <Label Width="30" Height="30" 
    Content="{Binding ElementName=DataGrid, Path=Items.Count}" />
    

    这是一个完整的示例:

      <Grid>
            <Grid.Resources>
                <Style TargetType="{x:Type local:BindingNavigator}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type local:BindingNavigator}">
                                <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                                    <Grid MinWidth="210" MinHeight="50">
                                        <Label Width="30" Height="30" 
    Content="{Binding ElementName=dataGrid1, Path=Items.Count}" />
                                    </Grid>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
    
            </Grid.Resources>
            <StackPanel>
                <DataGrid Name="dataGrid1" VerticalAlignment="Top" Width="210">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="header" />
                    </DataGrid.Columns>
                </DataGrid>
                <local:BindingNavigator x:Name="bindingNavigator1" />
            </StackPanel>
        </Grid>
    

    【讨论】:

    • 感谢您的回复 Greg Sansom,但自定义控件 XAML 中不知道 MainWindow XAML 的 DataGrid 实例。这就是为什么我尝试将它绑定到自定义控件中的属性。
    • 这个我的朋友...非常有用!我想通过ElementNamePath 我可以访问所有属性。真的很不错!
    【解决方案2】:

    我发现这对我有用...

        <Style.Triggers>
            <DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
                <Setter Property="Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None">
                            <VisualBrush.Visual>
                                <TextBlock Text="We did't find any matching records for your search..." FontSize="16" FontWeight="SemiBold" Foreground="LightCoral"/>
                            </VisualBrush.Visual>
                        </VisualBrush>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    

    【讨论】:

    • +1 这个解决方案的优点是可用于您不知道“元素名称”的通用 DataGrid 样式
    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2015-06-03
    • 1970-01-01
    • 2013-03-15
    • 2012-07-20
    相关资源
    最近更新 更多