将usercontrol中的文本框绑定到datagrid

时间:2014-01-27 22:44:32

标签: wpf xaml datagrid

我将UserControl绑定到DataGrid的方式是否正确? 在我的MainWindow中,我有一个datagrid(下面的代码):

    <DataGrid x:Name="MusicListGrid" ItemsSource="{Binding MusicList}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Artist" Binding="{Binding Artist,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
            <DataGridTextColumn Header="Album" Binding="{Binding Album,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
            <DataGridTextColumn Header="Track" Binding="{Binding Track,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
        </DataGrid.Columns>
    </DataGrid>

我的MainWindow中的usercontrol,我绑定到datagrid的选定项目:

DataTemplate(在MainWindow中):

<Window.Resources>
    <DataTemplate x:Key="MusicDetailListTemplate"  >
        <v:MusicDetailView DataContext="{Binding ElementName=MusicListGrid,Path=SelectedItem}" />
    </DataTemplate>
</Window.Resources>

ContentControl(在MainWindow中):

<ContentControl x:Name="musicDetail" Content="{Binding}" ContentTemplate="{StaticResource MusicDetailListTemplate}" Grid.Column="1" />

我的UserControl中的文本框如下所示:

    <TextBox Grid.Column="1" Grid.Row="0" Width="200" Margin="10,5" Text="{Binding Artist,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Grid.Column="1" Grid.Row="1" Width="200" Margin="10,5" Text="{Binding Album,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Grid.Column="1" Grid.Row="2" Width="200" Margin="10,5" Text="{Binding Track,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />

这有效,但我不确定我是否采取了正确的方法? 我还可以将文本框绑定到数据网格,如下所示:

<TextBox Grid.Column="1" Grid.Row="3" Text="{Binding Path=MusicListGrid.Artist.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"  />

数据网格中的数据是ObservableCollection<Music>(音乐是我的模型)。

如果我用tabcontrol替换我的UserControl,我应该将tabcontrol作为单独的视图还是只是MainWindow的一部分?并且tabcontrol的内容是单独的视图吗?我正在考虑使用datagrid和带有2个选项卡的tabcontrol,一个用于编辑,另一个用于显示(看起来更具代表性)。

对不起,如果这些是非常基本的问题,我只想走正确的道路。

1 个答案:

答案 0 :(得分:2)

Content元素的ContentControl属性设置为数据对象更为常见:

<ContentControl x:Name="musicDetail" Content="{Binding ElementName=MusicListGrid, 
    Path=SelectedItem}" ContentTemplate="{StaticResource MusicDetailListTemplate}" />

DataContext定义相关类型的数据在UI中应该是什么样的,所以你不应该真正设置DataContext ......它会自动设置为相关的数据对象实例...它应该看起来更像这样(其中Prefix是您为项目设置的XML命名空间前缀,YourClassDataGrid中对象的类型:< / p>

<Window.Resources>
    <DataTemplate x:Key="MusicDetailListTemplate" DataType="{x:Type Prefix:YourClass}">
        <v:MusicDetailView DataContext="{Binding}" />
    </DataTemplate>
</Window.Resources>