我有一个包含DependencyProperty(MyProperty)的WPF UserControl。
DependencyProperty绑定到DataContext中的Property。
现在在UserControl中我想更改bound属性的值。但是,如果我指定MyProperty = NewValue
,则绑定将丢失并由NewValue替换。
我想要实现的是更改DependencyProperty绑定的DataContext属性。
如何实现这一目标而不是更改绑定?
澄清:使用像MyTextBox.Text = "0";
这样的东西,我将释放绑定。我如何设置Text,保持绑定完整,因此绑定的属性也将改变。
答案 0 :(得分:5)
您可以使用SetCurrentValue。
SetCurrentValue方法更改属性的有效值,但现有的触发器,数据绑定和样式将继续有效。
答案 1 :(得分:3)
如果没有看到你的代码,我无法分辨你做错了什么。下面是一个简单的用户控件,允许用户选择颜色。
<UserControl x:Class="ColorPickerTest.ColorPicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Orientation="Horizontal">
<ToggleButton Name="redButton" Content="Red" Click="Button_Click" />
<ToggleButton Name="yellowButton" Content="Yellow" Click="Button_Click" />
</StackPanel>
</UserControl>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace ColorPickerTest
{
public partial class ColorPicker : UserControl
{
public ColorPicker()
{
InitializeComponent();
}
public Brush SelectedColor
{
get { return (Brush)GetValue(SelectedColorProperty); }
set { SetValue(SelectedColorProperty, value); }
}
public static readonly DependencyProperty SelectedColorProperty =
DependencyProperty.Register("SelectedColor",
typeof(Brush),
typeof(ColorPicker),
new UIPropertyMetadata(Brushes.Transparent, OnPropertyChanged));
private void Button_Click(object sender, RoutedEventArgs e)
{
if (!redButton.IsChecked.GetValueOrDefault() && !yellowButton.IsChecked.GetValueOrDefault())
{
SelectedColor = Brushes.Transparent;
}
else if (!redButton.IsChecked.GetValueOrDefault() && yellowButton.IsChecked.GetValueOrDefault())
{
SelectedColor = Brushes.Yellow;
}
else if (redButton.IsChecked.GetValueOrDefault() && !yellowButton.IsChecked.GetValueOrDefault())
{
SelectedColor = Brushes.Red;
}
else
{
// redButton.IsChecked.GetValueOrDefault() && yellowButton.IsChecked.GetValueOrDefault())
SelectedColor = Brushes.Orange;
}
}
private static void OnPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
{
ColorPicker colorPicker = sender as ColorPicker;
colorPicker.redButton.IsChecked = colorPicker.SelectedColor == Brushes.Red ||
colorPicker.SelectedColor == Brushes.Orange;
colorPicker.yellowButton.IsChecked = colorPicker.SelectedColor == Brushes.Yellow ||
colorPicker.SelectedColor == Brushes.Orange;
}
}
}
<Window x:Class="ColorPickerTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ColorPickerTest="clr-namespace:ColorPickerTest"
Height="300" Width="300">
<StackPanel>
<ColorPickerTest:ColorPicker SelectedColor="{Binding Path=MyColor, Mode=TwoWay}" />
</StackPanel>
</Window>
using System.Windows;
using System.Windows.Media;
namespace ColorPickerTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
MyColor = Brushes.Red;
DataContext = this;
}
private Brush _myColor;
public Brush MyColor
{
get { return _myColor; }
set
{
_myColor = value;
Background = _myColor;
}
}
}
}
答案 2 :(得分:1)
这应该按原样工作,唯一的问题是当文本框失去焦点时,文本框绑定的绑定源将被更新。这是默认行为。您可以通过在绑定中指定UpdateSourceTrigger=PropertyChanged
来更改它。像这样:
<TextBox Name="MyTextBox" Text="{Binding YourBindingPath, UpdateSourceTrigger=PropertyChanged}"/>