在DataGrid

时间:2017-03-28 18:27:51

标签: c# wpf xaml datagrid wpf-controls

我尝试使用带有DependencyProperty绑定的自定义控件来处理DataGrid中的列。一切都在努力,直到我选择一行。

我的自定义控件ShiftControl.xaml:

<UserControl x:Class="xRoster.UserControls.ShiftControl"
             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" 
             xmlns:local="clr-namespace:xRoster.UserControls">
  <TextBlock x:Name="tbShift"
             Text="{Binding Path=Shift}"
             TextWrapping="Wrap"
             VerticalAlignment="Center"
             HorizontalAlignment="Center"/>
</UserControl>

我对ShiftControl.xaml.cs的代码隐藏:

public partial class ShiftControl : UserControl
{
    public ShiftControl()
    {
        InitializeComponent();
        tbShift.DataContext = this;
    }

    public static readonly DependencyProperty ShiftProperty =
        DependencyProperty.Register(
            "Shift", typeof(string), typeof(ShiftControl));

    public string Shift
    {
        get { return (string)GetValue(ShiftProperty); }
        set { SetValue(ShiftProperty, value); }
    }
}

我在DataGrid窗口中使用ShiftControl的代码.xaml:

<UserControl.Resources>
  <DataTemplate x:Key="day1Column">
    <uc:ShiftControl Shift="{Binding Day1Shift.Display}"/>
  </DataTemplate>
</UserControl.Resources>   

<DataGrid ItemsSource="{Binding Employees}"
          AutoGenerateColumns="False"
          HeadersVisibility="Column"
          RowHeight="50">
  <DataGrid.Columns>                
    <DataGridTemplateColumn Header="Montag"
                            HeaderStyle="{StaticResource columnHeaderStyle}" 
                            CellTemplate="{StaticResource day1Column}"
                            CellEditingTemplate="{StaticResource day1Column}"/>
  </DataGrid.Columns>
</DataGrid>

正如我所说,我的ShiftControl的绑定仅在没有选择放置它的行时才有效。

任何想法? 提前致谢

1 个答案:

答案 0 :(得分:0)

在ShiftControl中,您设置的DataBinding是不够的。仅为绑定提供路径会尝试将值绑定到当前DataContext的指定路径(可能会根据您对控件的使用而改变)

您应该在ShiftControl.xaml中明确定义BindingSource

试试这个:

<TextBlock x:Name="tbShift"
           Text="{Binding Path=Shift,
               RelativeSource={RelativeSource
                   Mode=FindAncestor,
                   Type={x:Type ShiftControl}}}"
           TextWrapping="Wrap"
           VerticalAlignment="Center"
           HorizontalAlignment="Center"/>