2010-11-11 54 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