【问题标题】:Binding textboxes inside a usercontrol to datagrid将用户控件内的文本框绑定到数据网格
【发布时间】:2014-01-27 22:44:32
【问题描述】:

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

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

主窗口中的用户控件,我绑定到数据网格的选定项:

数据模板(在主窗口中):

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

ContentControl(在主窗口中):

<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&lt;Music&gt;(音乐是我的模型)。

如果我用 tabcontrol 替换我的 UserControl,我应该让 tabcontrol 成为一个单独的视图还是只是 MainWindow 的一部分? tabcontrol 的内容是否是单独的视图?我正在考虑让数据网格和一个带有 2 个选项卡的选项卡控件,一个用于编辑,另一个用于显示(看起来更美观)。

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

【问题讨论】:

    标签: wpf xaml datagrid


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!
    猜你喜欢
    • 2012-11-21
    • 2011-02-03
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2012-01-15
    • 2020-03-12
    相关资源
    最近更新 更多