ReadOnlyDependencyPropertyBindingBehavior Class
Allows you to bind read-only dependency and attached properties to a ViewModel’s properties.
Namespace: DevExpress.Mvvm.UI
Assembly: DevExpress.Xpf.Core.v24.2.dll
NuGet Package: DevExpress.Wpf.Core
Declaration
Remarks
Specify the following properties to use ReadOnlyDependencyPropertyBindingBehavior:
- Binding
- Gets or sets a binding that should be applied to the specified property. This is a dependency property.
- Property
- Gets or sets the bound property’s name. This is a dependency property.
- DependencyProperty
- Gets or sets the bound property. This is a dependency property.
Customization properties:
- Command
- Gets or sets the command that the ReadOnlyDependencyPropertyBindingBehavior should execute when the bound property’s value is changed (specified in the Property or DependencyProperty). This is a dependency property.
- IsEnabled
- Gets or sets whether a bound ViewModel’s property should be updated. This is a dependency property.
Follow the steps below to bind a read-only dependency property to a ViewModel’s property:
Attach the behavior to a target control and choose one of the following options:
Set the Property to a target property’s name:
<TreeView> <dxmvvm:Interaction.Behaviors> <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Property="SelectedItem" /> </dxmvvm:Interaction.Behaviors> </TreeView>
Use the DependencyProperty to specify a target dependency/attached property:
<TreeView> <dxmvvm:Interaction.Behaviors> <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior DependencyProperty="{x:Static TreeView.SelectedItemProperty}" /> </dxmvvm:Interaction.Behaviors> </TreeView>
Use the behavior’s Binding property to specify a binding to the target ViewModel’s property.
<TreeView> <dxmvvm:Interaction.Behaviors> <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Binding="{Binding SelectedMenuItem, Mode=OneWayToSource}" DependencyProperty="{x:Static TreeView.SelectedItemProperty}" /> </dxmvvm:Interaction.Behaviors> </TreeView>
The following code sample binds the TreeView.SelectedItem read-only property to the ViewModel’s SelectedMenuItem property:
<UserControl x:Class="DXSample.Views.MainView"
<!-- ... -->
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
<!-- ... -->
xmlns:ViewModels="clr-namespace:DXSample.ViewModels"
<!-- ... -->
<UserControl.DataContext>
<ViewModels:MainViewModel />
</UserControl.DataContext>
<DockPanel>
<TreeView Name="view" ItemsSource="{Binding Menu}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type ViewModels:MenuItemViewModel}" ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Title}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
<dxmvvm:Interaction.Behaviors>
<dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Binding="{Binding SelectedMenuItem, Mode=OneWayToSource}"
DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
</dxmvvm:Interaction.Behaviors>
</TreeView>
</DockPanel>
</UserControl>
using System.Collections.ObjectModel;
using System.Windows;
using DevExpress.Mvvm;
using DevExpress.Mvvm.DataAnnotations;
// ...
public class MainViewModel : ViewModelBase {
public MenuItemViewModel SelectedMenuItem {
get { return GetProperty(() => SelectedMenuItem); }
set { SetProperty(() => SelectedMenuItem, value); }
}
[Command]
public void Open() {
// ...
}
// ...
}
How to: Pass Validation Data from the GridControl to a ViewModel
To pass validation data from the GridControl to a view model, use the ReadOnlyDependencyPropertyBindingBehavior
to bind the view’s HasErrors property to a view model property. Set the view’s ErrorsWatchMode property to Cells.
<dx:ThemedWindow x:Class="DXSample.MainWindow"
Title="{DXBinding '`GridControl has errors: ` + HasErrors'}">
<dx:ThemedWindow.DataContext>
<local:MainViewModel />
</dx:ThemedWindow.DataContext>
<DockPanel>
<dxg:GridControl AutoGenerateColumns="AddNew"
ItemsSource="{Binding TaskList}">
<dxg:GridControl.View>
<dxg:TableView ErrorsWatchMode="Cells"
InvalidRowExceptionCommand="{Binding InvalidRowCommand}"
ValidateRowCommand="{Binding ValidateRowCommand}">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Property="HasErrors"
Binding="{Binding HasErrors, UpdateSourceTrigger=PropertyChanged}" />
</dxmvvm:Interaction.Behaviors>
</dxg:TableView>
</dxg:GridControl.View>
</dxg:GridControl>
</DockPanel>
</dx:ThemedWindow>
public class MainViewModel : ViewModelBase {
public bool HasErrors {
get { return GetValue<bool>(); }
set { SetValue(value); }
}
public ObservableCollection<Task> TaskList { get; }
public MainViewModel() {
TaskList = new ObservableCollection<Task> {
new Task() {
TaskName = "Complete Project A",
StartDate = new DateTime(2009, 7, 17),
EndDate = new DateTime(2009, 7, 10)
},
new Task() {
TaskName = "Test Website",
StartDate = new DateTime(2009, 7, 10),
EndDate = new DateTime(2009, 7, 12)
},
new Task() {
TaskName = string.Empty,
StartDate = new DateTime(2009, 7, 4),
EndDate = new DateTime(2009, 7, 6)
}
};
}
[Command]
public void ValidateRow(RowValidationArgs args) {
args.Result = GetValidationErrorInfo((Task)args.Item);
}
static ValidationErrorInfo GetValidationErrorInfo(Task task) {
if (task.StartDate > task.EndDate)
return new ValidationErrorInfo("Start Date must be less than End Date");
if (string.IsNullOrEmpty(task.TaskName))
return new ValidationErrorInfo("Enter a task name");
return null;
}
[Command]
public void InvalidRow(InvalidRowExceptionArgs args) {
args.ExceptionMode = ExceptionMode.NoAction;
}
}