2010-11-11 53 views
4

即时通讯新的wpf,并尝试将静态定义的DataGrid的Items.Count属性绑定到我的自定义控件的标签。WPF - 绑定Datagrid Items.Count到自定义控件标签

我目前的实现看起来像这样。但标签保持为空:我

在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; } 
    } 
} 

应该显示在标签

<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> 
的Items.Count的的CustomControl的XAML

我部署自定义控件的XAML

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

背后的事件处理代码,我填写的电网和设置的自定义控制

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

     bindingNavigator1.DataGrid = dataGrid1; 
    } 

DataGrid的财产,为什么我不能在Items.Count属性绑定标签?

回答

8

您需要做的就是将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> 
+0

感谢您的回复格雷格桑塞姆, 但DataGrid实例MainWindow XAML在自定义控件XAML中不是已知的。这就是为什么我尝试将其绑定到自定义控件中的属性。 – 2010-11-12 08:45:48

+0

Sry Greg,我明白了! 你说得对。谢谢你的帮助。 – 2010-11-12 09:38:17

+0

这是我的朋友......非常有用!我想'ElementName'和'Path'我可以访问所有属性。真的很好! – C4u 2016-10-07 08:51:37

1

我发现这个工作对我来说...

<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> 
+0

+1:此解决方案的优点是可用于通用DataGrid风格,您不知道'ElementName' – Bruno 2015-03-27 09:58:18