У меня есть WPF UserControl, содержащий DependencyProperty (MyProperty).
DependencyProperty связывается со Свойством в DataContext.
Теперь в UserControl я хочу изменить значение связанного свойства. Но если я присваиваюсь MyProperty = NewValue
Привязка потеряна и заменена NewValue.
То, чего я хочу достигнуть, является изменением DataContext-свойство, с которым связывается DependencyProperty.
Как я достигаю этого вместо того, чтобы изменить привязку?
Разъясниться: использование чего-то как MyTextBox.Text = "0";
Я выпущу привязку. То, как я установил бы текст, оставить привязку неповрежденной, таким образом, текст свойства связывается с, изменится, также.
Я не могу сказать, что вы делаете неправильно, не увидев вашего кода. Ниже приведен простой элемент управления, который позволяет пользователям выбирать цвет.
<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;
}
}
}
}
Это должно работать как есть, единственная проблема заключается в том, что источник привязки текстового поля привязан в будет обновлен, когда текстовое поле теряет фокус. Это поведение по умолчанию. Вы можете изменить его, указав UpdateSourceTrigger = PropertyChanged
в вашей привязке. Вот так:
<TextBox Name="MyTextBox" Text="{Binding YourBindingPath, UpdateSourceTrigger=PropertyChanged}"/>
Вы можете использовать SetCurrentValue .
Метод SetCurrentValue изменяет действующее значение свойства, но существующие триггеры, привязки данных и стили будут продолжать работать.