WPF绑定UserControl中的控件

时间:2013-12-27 10:26:30

标签: wpf data-binding user-controls

我在UserControl中有一个ComboBox。我在带有DataGrid的Window中使用UserControl:UserControl DataContext是DataGrid SelectedItem。 UserControl中的ComboBox通过SelectedValue属性绑定到SelectedItem的“ID”字段。为了实现这一点,我在UserControl中编写了一个DependencyProperty,就像这样

Public Shared SelectedValueProperty As DependencyProperty = _
DependencyProperty.Register("SelectedValue", GetType(Object), GetType(ucEditCombo))
    Public Property SelectedValue() As Object
        Get
            Return CType(GetValue(SelectedValueProperty), Object)
        End Get
        Set(ByVal value As Object)
            SetCurrentValue(SelectedValueProperty, value)
        End Set
    End Property

并将ComboBox SelectedValue属性绑定到XAML中的UserControl SelectedValue属性:

<ComboBox SelectedValuePath="{Binding ElementName=EditCombo,Path=SelectedValuePath}"
          DisplayMemberPath="{Binding ElementName=EditCombo,Path=DisplayMemberPath}"
          ItemsSource="{Binding ElementName=EditCombo,Path=ItemsSource}"
          SelectedValue="{Binding ElementName=EditCombo,Path=SelectedValue,Mode=TwoWay}"
          Visibility="{Binding ElementName=EditCombo,Path=ComboVisibility}"
          Name="cmb"/>

(EditCombo是x:我在XAML中为UserControl提供的名称)。

运行应用程序我不是以下内容:

  1. 如果我更改DataGrid选择,则ComboBox显示的值会正确更改。
  2. 只要我在控件上直接更改ComboBox选定值,DataGrid中的值就不会更新,并且ComboBox不再绑定到DataGrid SelectedItem。

1 个答案:

答案 0 :(得分:0)

有关更新原始DataGrid SelectedItem的问题并不明显,尽管我认为它与ComboBox上的绑定有关。我需要看看Window xaml和UserControl的代码,以确保。

我尝试用一​​个例子重现问题,但我无法做到。因此,为了加快您的行动,我已经发布了以下示例。

假设:UserControl正在尝试修改绑定到SelectedValue DependencyProperty的对象的属性,而不是尝试替换该对象。 如果假设不正确,使用与问题相关的额外代码更新问题,我将尝试更新我的答案。

首先,我在创建名为ItemModel的StackOverflow问题的代码时使用了一个模型。

Public Class ItemModel
    Public Property Id as Guid
    Public Property Text as String
End Class

在Window上,我创建了一个名为Items的ObservableCollection(Of ItemModel)属性。它包含3个项目,每个项目的Text属性设置为值“One”,“Two”或“Three”之一。每个项目的ID都设置为新的guid。

所以,我的主窗口xaml看起来像

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:this="clr-namespace:StackOverflow._20798974"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
            <this:ucEditCombo SelectedValue="{Binding ElementName=MyGrid, Path=SelectedItem}" />
        </StackPanel>
        <DataGrid x:Name="MyGrid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Text" Binding="{Binding Text}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</Window>

ucEditCombo UserControl背后的代码包含您在上面的问题中定义的DependencyProperty和一个ObservableCollection(Of String),其中填充了值“One”,“Two”,“Three”和“Four”。 / p>

用户控件的xaml是

<UserControl x:Class="ucEditCombo" 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:this="clr-namespace:StackOverflow._20798974"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type this:ucEditCombo}}}">
        <ComboBox ItemsSource="{Binding Path=Items}" SelectedValue="{Binding Path=SelectedValue.Text}" />
    </Grid>
</UserControl>

上面的示例允许我选择一个DataGrid项,并使该项的Text属性立即出现在ComboBox中。它还允许在ComboBox中选择不同的值,并在DataGrid中更新该值。

注意事项。

  1. 在Controls构造函数中设置Control的DataContext将破坏Window上的SelectedItem绑定。为了解决这个问题,我在UserControl的第一个内容元素(Grid元素)上设置了DataContext。
  2. DataContext设置为UserControl本身,简化了Combobox上的一些绑定。
  3. 当我们修改DependencyProperty的属性时,很多WPF绑定子系统通知都会为我们处理。
  4. SelectedValue和SelectedItem的默认绑定模式是TwoWay。
  5. 我希望这会有所帮助。