在WPF中,我无法在DataGrid上获得双向绑定,以便用户控制可观察的集合

在WPF中,我无法在DataGrid上获得双向绑定,以便用户控制可观察的集合,wpf,xaml,data-binding,wpf-controls,wpfdatagrid,Wpf,Xaml,Data Binding,Wpf Controls,Wpfdatagrid,我有一个自定义UserControl,它被修改为3状态。它绑定到一个绑定,该绑定具有用户控件的我自己的依赖属性,以及带有DataGrid的ObservableCollection数据的标记属性。我不知道为什么我的数据在更改时没有更新。我把它设为双向绑定。我正在使用ItemCollectionViewSource进行数据绑定。这是我的密码 我的数据网格 定义了自己的自定义ButtonState属性后,不需要使用Tag属性。此外,您正在重写UserControl的DataContext。不要这样做。

我有一个自定义UserControl,它被修改为3状态。它绑定到一个绑定,该绑定具有用户控件的我自己的依赖属性,以及带有DataGrid的ObservableCollection数据的标记属性。我不知道为什么我的数据在更改时没有更新。我把它设为双向绑定。我正在使用ItemCollectionViewSource进行数据绑定。这是我的密码

我的数据网格

定义了自己的自定义ButtonState属性后,不需要使用Tag属性。此外,您正在重写UserControl的DataContext。不要这样做。此代码应能更好地工作:

public partial class FancyButton : UserControl
{
    public FancyButton()
    {
        InitializeComponent();
    }

    public string ButtonState
    {
        get { return (string)GetValue(ButtonStateProperty); }
        set { SetValue(ButtonStateProperty, value); }
    }

    public static readonly DependencyProperty ButtonStateProperty =
        DependencyProperty.Register("ButtonState", typeof(string), typeof(FancyButton), new PropertyMetadata(""));

    private void Button_Click(object sender, RoutedEventArgs e)
    {

        if (ButtonState == "None")
        {
            ButtonState = "On";
        }
        else if (ButtonState == "On")
        {
            ButtonState = "Off";
        }
        else if (ButtonState == "Off")
        {
            ButtonState = "None";
        }
        else
        {
            ButtonState = "On";
        }
    }

    private void HelloButton_LostFocus(object sender, RoutedEventArgs e)
    {

    }
}
XAML:


你的实际问题是什么?当你点击按钮时,按钮的颜色不会改变吗?我的问题是,当我使用完整的数据设置DataGrid源时,用户控件不会获取值并相应地更改颜色。只是双向数据绑定在用户控件上不起作用:FancyButtonTank you。非常感谢。非常感谢。我整天都在忙这个项目,想弄明白这一点。你是最棒的。我不知道可以将UserControl的DependencyProperty绑定到它自己。我会投票给你,但我还不能。请你详细解释一下你做了什么。当你的声誉至少达到15岁时,你应该可以投票。正如我在回答中指出的,您不应该在UserControl的构造函数中设置其DataContext。然后绑定到DataGrid中的Result属性将失败。现在我明白了。再次感谢。
<UserControl x:Class="caM.UserControls.FancyButton"
         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:caM.UserControls"
         mc:Ignorable="d" Width="37" Height="31">
<UserControl.Resources>

</UserControl.Resources>
<Grid>
    <Button x:Name="HelloButton" Click="Button_Click"  Tag="{Binding Path= ButtonState , Mode=TwoWay ,UpdateSourceTrigger=PropertyChanged}" Margin="0" LostFocus="HelloButton_LostFocus">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Style.Triggers>
                    <Trigger Property="Tag" Value="None">
                        <Setter Property="Content" Value="Image1"/>
                        <Setter Property="Content">
                            <Setter.Value>
                                <Grid>
                                    <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                                        <Rectangle.Fill>
                                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                                <GradientStop Color="#FFBBBBBB" Offset="0.004"/>
                                                <GradientStop Color="#FFBBBBBB" Offset="0.992"/>
                                                <GradientStop Color="#FFEEEEEE" Offset="0.209"/>
                                                <GradientStop Color="#FFEAEAEA" Offset="0.771"/>
                                                <GradientStop Color="White" Offset="0.478"/>
                                            </LinearGradientBrush>
                                        </Rectangle.Fill>
                                    </Rectangle>
                                </Grid>

                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="Tag" Value="On">
                        <Setter Property="Content" Value="Image2"/>
                        <Setter Property="Content">
                            <Setter.Value>
                                <Grid>
                                    <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                                        <Rectangle.Fill>
                                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                                <GradientStop Color="#FF2A9C25" Offset="0.004"/>
                                                <GradientStop Color="#FF2A9C25" Offset="0.992"/>
                                                <GradientStop Color="#FF8DE28D" Offset="0.209"/>
                                                <GradientStop Color="#FFA3E6A0" Offset="0.763"/>
                                                <GradientStop Color="#FFC9FFC6" Offset="0.482"/>
                                            </LinearGradientBrush>
                                        </Rectangle.Fill>
                                    </Rectangle>
                                </Grid>

                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="Tag" Value="Off">
                        <Setter Property="Content" Value="Image3"/>
                        <Setter Property="Content">
                            <Setter.Value>
                                <Grid>
                                    <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                                        <Rectangle.Fill>
                                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                                <GradientStop Color="#FF9C2525" Offset="0.004"/>
                                                <GradientStop Color="#FF9C2525" Offset="0.992"/>
                                                <GradientStop Color="#FFE28D8D" Offset="0.209"/>
                                                <GradientStop Color="#FFE6A0A0" Offset="0.763"/>
                                                <GradientStop Color="#FFFFC6C6" Offset="0.482"/>
                                            </LinearGradientBrush>
                                        </Rectangle.Fill>
                                    </Rectangle>
                                </Grid>

                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        <Button.Template>
            <ControlTemplate TargetType="{x:Type Button}">

                <Grid>
                    <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                        <Rectangle.Fill>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#FFBBBBBB" Offset="0.004"/>
                                <GradientStop Color="#FFBBBBBB" Offset="0.992"/>
                                <GradientStop Color="#FFEEEEEE" Offset="0.209"/>
                                <GradientStop Color="#FFEAEAEA" Offset="0.771"/>
                                <GradientStop Color="White" Offset="0.478"/>
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                    <ContentPresenter Content="{TemplateBinding Content}"/>
                </Grid>
            </ControlTemplate>
        </Button.Template>
    </Button>

</Grid>
public partial class FancyButton : UserControl
    {
        public FancyButton()
        {
            InitializeComponent();
            this.DataContext = this;
            Tag = "None";
            ButtonState = "None";
        }



        public string ButtonState 
        {
            get { return (string)GetValue(ButtonStateProperty); }
            set { SetValue(ButtonStateProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ButtonState.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ButtonStateProperty =
            DependencyProperty.Register("ButtonState", typeof(string), typeof(FancyButton), new PropertyMetadata(""));




        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var roaw = ((FrameworkElement)sender).DataContext as DataRowView;


            if (HelloButton.Tag.ToString() == "None")
            {
                HelloButton.Tag = "On";
                ButtonState = "On";
            }
            else if (HelloButton.Tag.ToString() == "On")
            {
                HelloButton.Tag = "Off";
                ButtonState = "Off";
            }
            else if (HelloButton.Tag.ToString() == "Off")
            {
                HelloButton.Tag = "None";
                ButtonState = "None";
            }
            else
            {
                HelloButton.Tag = "On";
                ButtonState = "On";
            }
        }

        private void HelloButton_LostFocus(object sender, RoutedEventArgs e)
        {

        }
    }
public partial class FancyButton : UserControl
{
    public FancyButton()
    {
        InitializeComponent();
    }

    public string ButtonState
    {
        get { return (string)GetValue(ButtonStateProperty); }
        set { SetValue(ButtonStateProperty, value); }
    }

    public static readonly DependencyProperty ButtonStateProperty =
        DependencyProperty.Register("ButtonState", typeof(string), typeof(FancyButton), new PropertyMetadata(""));

    private void Button_Click(object sender, RoutedEventArgs e)
    {

        if (ButtonState == "None")
        {
            ButtonState = "On";
        }
        else if (ButtonState == "On")
        {
            ButtonState = "Off";
        }
        else if (ButtonState == "Off")
        {
            ButtonState = "None";
        }
        else
        {
            ButtonState = "On";
        }
    }

    private void HelloButton_LostFocus(object sender, RoutedEventArgs e)
    {

    }
}
<Button x:Name="HelloButton" Click="Button_Click" Margin="0" LostFocus="HelloButton_LostFocus">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ButtonState, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="None">
                    <Setter Property="Content" Value="Image1"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <Grid>
                                <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                                    <Rectangle.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FFBBBBBB" Offset="0.004"/>
                                            <GradientStop Color="#FFBBBBBB" Offset="0.992"/>
                                            <GradientStop Color="#FFEEEEEE" Offset="0.209"/>
                                            <GradientStop Color="#FFEAEAEA" Offset="0.771"/>
                                            <GradientStop Color="White" Offset="0.478"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                </Rectangle>
                            </Grid>

                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding ButtonState, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="On">
                    <Setter Property="Content" Value="Image2"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <Grid>
                                <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                                    <Rectangle.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FF2A9C25" Offset="0.004"/>
                                            <GradientStop Color="#FF2A9C25" Offset="0.992"/>
                                            <GradientStop Color="#FF8DE28D" Offset="0.209"/>
                                            <GradientStop Color="#FFA3E6A0" Offset="0.763"/>
                                            <GradientStop Color="#FFC9FFC6" Offset="0.482"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                </Rectangle>
                            </Grid>

                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding ButtonState, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="Off">
                    <Setter Property="Content" Value="Image3"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <Grid>
                                <Rectangle Width="Auto" Height="Auto" Tag="None" RadiusY="18" RadiusX="18">
                                    <Rectangle.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FF9C2525" Offset="0.004"/>
                                            <GradientStop Color="#FF9C2525" Offset="0.992"/>
                                            <GradientStop Color="#FFE28D8D" Offset="0.209"/>
                                            <GradientStop Color="#FFE6A0A0" Offset="0.763"/>
                                            <GradientStop Color="#FFFFC6C6" Offset="0.482"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                </Rectangle>
                            </Grid>

                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Rectangle Width="50" Height="50" Tag="None" RadiusY="18" RadiusX="18">
                    <Rectangle.Fill>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FFBBBBBB" Offset="0.004"/>
                            <GradientStop Color="#FFBBBBBB" Offset="0.992"/>
                            <GradientStop Color="#FFEEEEEE" Offset="0.209"/>
                            <GradientStop Color="#FFEAEAEA" Offset="0.771"/>
                            <GradientStop Color="White" Offset="0.478"/>
                        </LinearGradientBrush>
                    </Rectangle.Fill>
                </Rectangle>
                <ContentPresenter Content="{TemplateBinding Content}"/>
            </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>