Свойство привязки данных Usercontrol изменено MVVM - PullRequest
0 голосов
/ 15 ноября 2011

Я работаю с WPF и использую привязку данных.

Я хотел бы создать UserControl, у которого есть свойство, которое можно использовать для привязки данных.

Кроме того, я хочу обновитьнекоторое другое свойство в UserControl, если свойство изменилось.

Например,

public class MyControl : UserControl
{
....
....
....
....

        public ViewStyles CurrentView
        {
            get { return (ViewStyles)GetValue(CurrentViewProperty); }
            set
            {
                SetValue(CurrentViewProperty, value);
                UpdateView();
            }
        }
        public static readonly DependencyProperty CurrentViewProperty = DependencyProperty.Register("CurrentView", typeof(ViewStyles), typeof(ComboView));

....
.....
.....
.....
}

Возникают проблемы:

Используется ViewModel и в котором есть свойствоViewStyle, который связан с CurrentView в приведенном выше примере.

Другой комбинированный список элементов управления также связан с данными ViewStyle в ViewModel.

На самом деле, я хочу использовать комбинированный список, чтобы выбрать другой видмой контрольКак сделать это возможным в MVVM?

Я попробовал вышеуказанный метод.Однако пользовательский интерфейс (разные ViewStyles MyControl) не изменился.Он изменяется только при нажатии на него мышью.

Спасибо.

XAML: (MyControl)

<Views:MyControl Grid.Column="1" Grid.Row="1" Height="505" HorizontalAlignment="Left" Margin="2,0,0,0" Name="comboView1" VerticalAlignment="Top" Width="983" 
                 ViewStyle="{Binding Path=CurrentView}" BorderThickness="5" BorderBrush="Black" ItemsSource="{Binding Path=Images}" 
                 SelectedIndex="{Binding Path=CurrentIndex}" Foreground="White" 

</Views:MyControl>

XAML: (ComboBox)

<ComboBox Margin="0,3,1,0" Width="178" HorizontalAlignment="Right" Name="ViewDDBox" FontSize="13" Foreground="#FFF6F3F3" Background="#FF444444"
          BorderThickness="2" Height="23" VerticalAlignment="Top" Grid.Column="1" 
          ItemsSource="{Binding Path=ViewTypes}" IsEnabled="True" SelectedValue="{Binding Path=CurrentView, Mode=TwoWay}">
         </ComboBox>

Предполагается, что представление (некоторый эффект пользовательского интерфейса) будет изменено на MyControl после выбора в Combobox.Но теперь, это только изменится, когда я нажму на MyControl с помощью мыши.

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

UpdateView() в вашем установщике свойств CurrentView поднимает ОГРОМНЫЙ красный флаг!У никогда не должно быть содержимого, отличного от SetValue, в установщике свойств зависимостей, поскольку некоторые аспекты xaml вызывают SetValue напрямую, а не через свойство.Всегда используйте обратный вызов свойства coerce (если вы хотите проверить данные перед его установкой) или обратный вызов изменения свойства (если вы хотите действовать после , свойство изменяется, как я покажу в примере ниже).

Вы должны сделать это вместо:

public static DependencyProperty CurrentViewProperty = 
    DependencyProperty.Register("CurrentView", typeof(ViewStyles), typeof(ComboView),
    new FrameworkPropertyMetadata(CurrentViewPropertyChanged));

private static void CurrentViewPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyControl mc = (MyControl)d;
    mc.UpdateView();
}
0 голосов
/ 15 ноября 2011

Вместо того, чтобы связывать представление, почему бы не создать шаблонный элемент управления и затем связать представление элемента управления со свойством вашей модели представления?

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

Ознакомьтесь с этой статьей для получения справки по основам шаблонов и с этой для более подробного обсуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...