Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UserControl中控件的WPF绑定_Wpf_Data Binding_User Controls - Fatal编程技术网

UserControl中控件的WPF绑定

UserControl中控件的WPF绑定,wpf,data-binding,user-controls,Wpf,Data Binding,User Controls,我在UserControl中有一个组合框。我在带有DataGrid的窗口中使用UserControl:UserControl DataContext是DataGrid SelectedItem。UserControl中的ComboBox通过SelectedValue属性绑定到SelectedItem的“ID”字段。为了实现这一点,我在UserControl中编程了DependencyProperty,如下所示 Public Shared SelectedValueProperty As Depe

我在UserControl中有一个组合框。我在带有DataGrid的窗口中使用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是我在XAML中给UserControl的x:Name)

运行应用程序时,我不会执行以下操作:

  • 如果更改DataGrid选择,则组合框显示的值将正确更改
  • 只要我直接在控件上更改ComboBox selected值,DataGrid中的值就不会更新,ComboBox不再绑定到DataGrid SelectedItem

  • 关于更新原始DataGrid SelectedItem的问题并不明显,尽管我认为这与ComboBox上的绑定有关。我需要查看窗口xaml和UserControl的代码才能确定

    我试图用一个例子来重现这个问题,但我无法做到。所以为了加快你的前进速度,我发布了下面的例子

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

    首先,我有一个为StackOverflow问题创建代码时使用的模型,称为ItemModel

    Public Class ItemModel
        Public Property Id as Guid
        Public Property Text as String
    End Class
    
    在这个窗口中,我创建了一个名为Items的ObservableCollection(Of ItemModel)属性。它包含3个项目,每个项目的文本属性设置为值“一”、“二”或“三”之一。每个项目的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(字符串),其中填充了值“一”、“二”、“三”和“四”

    用户控件的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属性立即显示在组合框中。它还允许在组合框中选择不同的值,并在数据网格中更新该值

    注意事项

  • 在控件构造函数中设置控件的DataContext将破坏窗口上的SelectedItem绑定。为了解决这个问题,我在UserControl的第一个内容元素(网格元素)上设置了DataContext
  • DataContext被设置为UserControl本身,从而简化了Combobox上的一些绑定
  • 当我们修改DependencyProperty的属性时,我们会处理很多WPF绑定子系统通知
  • SelectedValue和SelectedItem的默认绑定模式为双向

  • 我希望这能有所帮助。

    谢谢你的回答,非常有启发性!对于我的个人问题,我唯一需要改变的是:(1)我在ucEditCombo XAML中设置SelectedValue=“{Binding Path=SelectedValue}”;(2) SelectedValue=“{Binding ElementName=MyGrid,Path=SelectedItem[field_Name]}”在使用UserControl的窗口XAML中。通过这样做,我可以绑定到当前所选DataRowView中需要的任何字段。