Почему я не могу привязать свойство viewmodel к свойству зависимости пользовательского элемента управления - PullRequest
3 голосов
/ 31 марта 2010

Я хочу использовать палитру цветов в своем приложении wpf, и на странице этого кодового проекта я увидел красивый. Элемент управления работает нормально, пока я не хочу подключить элемент управления к модели представления. Я создал небольшую тестовую программу с этой моделью представления:

public class ColorViewModel : ViewModelBase
{
    public ColorViewModel()
    {
        LineColor = Brushes.Yellow;
    }

    SolidColorBrush _brushColor;
    public SolidColorBrush LineColor
    {
        get { return _brushColor; }
        set
        {
            _brushColor = value;
            RaisePropertyChanged(() => LineColor);
        }
    }
}

У тестовой программы есть текстовое поле и элементы управления палитрой цветов:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Please Select a Color" FontWeight="Bold" Margin="10"
               Foreground="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged}"/>
     <vw:ColorPickerControlView x:Name="ForeColorPicker" Margin="10"
               CurrentColor="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged }"/>
</StackPanel>

В загруженном событии главного окна в моем тестовом приложении я установил viewmodel для datacontext следующим образом:

 DataContext = new ColorViewModel();

Проблема в том, что я не могу связать свойство LineColor viewmodel со свойством CurrentColor ColorPickerControlView. Свойство CurrentControl для ColorPickerControlView выглядит нормально. Конструктор выглядит так:

public ColorPickerControlView()
{
    this.DataContext = this;
    InitializeComponent();
    CommandBindings.Add(new CommandBinding(SelectColorCommand, SelectColorCommandExecute));
}

В конструкторе UserControl есть строка this.DataContext = this; Я прочитал, что необходимо связать свойства зависимости. Должен ли я переопределить эту строку, когда я устанавливаю свою viewmodel для datacontext, и поэтому я не могу привязать свойство CurrentColor? Есть ли обходной путь? Или я сделал еще одну ошибку?

Ответы [ 4 ]

8 голосов
/ 31 марта 2010

Вы правы, полагая, что фраза DataContext=this в конструкторе UserControl вытесняет при связывании с внешней моделью представления. Это было обсуждено в этом вопросе . Это легко исправить однако. В коде UserControl есть только один DependencyProperty, за которым связывается xaml: CurrentColor.

Сделайте это:

  • Добавьте атрибут Name="Root" к тегу UserControl UserControl's xaml
  • Изменить атрибут (тега Border) Background="{Binding Path=CurrentColor}" до:

    Background="{Binding ElementName=Root, Path=CurrentColor}"

  • Удалите оскорбительный DataContext = this линия от UserControl's конструктор!

Это должно быть все, что есть. Я написал доказательство концепции, которая демонстрирует вышеизложенное. Если хотите, я могу опубликовать это, но код выше должен быть всем, что вам нужно.

0 голосов
/ 08 мая 2010
  1. Удалить строку DataContext = this в файле ColorPickerControlView.xaml.cs
  2. Изменение привязки в ColorPickerControlView.xaml на Background = "{Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Тип CustomWPFColorPicker: ColorPickerControlView}}, Path = CurrentColor} "
0 голосов
/ 31 марта 2010

Строка this.DataContext = это на самом деле не нужно, поскольку вы заменяете DataContext на экземпляр ViewModel Вам также не нужно назначать DataContext для обработчика событий Loaded. Просто установите его на конструкторе. Вы можете установить его после вызова метода InitializeComponent.

0 голосов
/ 31 марта 2010

Обе привязки должны конфликтовать с установленным значением свойства. Попробуйте установить Mode=OneWay

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Please Select a Color" FontWeight="Bold" Margin="10"
               Foreground="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>
     <vw:ColorPickerControlView x:Name="ForeColorPicker" Margin="10"
               CurrentColor="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay }"/>
</StackPanel>
...