在WPF中,我无法在DataGrid上获得双向绑定,以便用户控制可观察的集合
我有一个自定义UserControl,它被修改为3状态。它绑定到一个绑定,该绑定具有用户控件的我自己的依赖属性,以及带有DataGrid的ObservableCollection数据的标记属性。我不知道为什么我的数据在更改时没有更新。我把它设为双向绑定。我正在使用ItemCollectionViewSource进行数据绑定。这是我的密码 我的数据网格 定义了自己的自定义ButtonState属性后,不需要使用Tag属性。此外,您正在重写UserControl的DataContext。不要这样做。此代码应能更好地工作:在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。不要这样做。
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>