Can I bind a WPF control to a field's property

2019-01-20 09:42发布

问题:

Because I needed to split some functionality between classes, I've arrived at the following situation

xaml code

<CheckBox IsChecked="{Binding MyObjectField.MyBoolean}"  />

view model

...
public MyInternalObject MyObjectField;
...

MyObject class

public class MyInternalObject {
    ...
    public bool MyBoolean { get; set; }
    ...
}

It does not work unless I replicate the MyBoolean property in the View Model class.

public bool MyBoolean 
{ 
    get { return MyInternalObject.MyBoolean; }
    set { MyInternalObject.MyBoolean=value; }
}

Does anyone have an idea?

回答1:

No you cant . Because binding system uses Reflection to find the

Property in DataContext(i.e your VM)

It does not look for fields . I hope this will help.



回答2:

You can't yet (in WPF Version 4.5 you can bind to a static property). But you can create your property in App.xaml.cs

public partial class App : Application
{
    public bool MyBoolean { get; set; }
}

and bind from everywhere.

<CheckBox IsChecked="{Binding MyBoolean, Source={x:Static Application.Current}}">


回答3:

Instead of binding an element to a field's property I changed the DataContext of the element to the required field.

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        MainWindowView mainWindowView = new MainWindowView();
        var mainWindowViewModel = new MainWindowViewModel();
        mainWindowView.DataContext = mainWindowViewModel;
        mainWindowView.pagerView.DataContext = mainWindowViewModel.pager;
        mainWindowView.Show();
    }

In this example I have a DataGrid and Pager (first, prev, next, last page) below it. The elements of the MainWindowView (including the DataGrid) are binded to properties in the MainWindowViewModel but the pager buttons are binded to the properties of mainWindowViewModel.pager.

MainWindowView:

    <DataGrid Name="dgSimple" ItemsSource="{Binding DisplayedUsers}" MaxWidth="200" Grid.Row="0" SelectedItem="{Binding SelectedRow}"></DataGrid>
    <view:PagerView x:Name="pagerView" Grid.Row="2"/>

PagerView:

<UserControl x:Class="wpf_scroll.View.PagerView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:wpf_scroll.View"
         mc:Ignorable="d" 
         d:DesignHeight="30" d:DesignWidth="350">
<StackPanel Orientation="Horizontal" Grid.Row="1">
    <Label Content="Page size:"/>
    <TextBox Text="{Binding PageSize}" Width="30" VerticalContentAlignment="Center"
                 HorizontalContentAlignment="Center"></TextBox>
    <Button Content="First" Command="{Binding FirstPageCommand}"></Button>