从带有棱镜6的Wpf框架装订高度/宽度

时间:2015-10-01 15:32:31

标签: c# wpf mvvm binding prism

我的ViewMain.xaml中有一个Frame,我需要从中读取高度/宽度。在ViewModel中,我有2个prism属性和一个应该通过ObservesProperty调用的命令。该命令使用高度/宽度进行一些计算。我试图用所有模式(TwoWay等)绑定高度/宽度。

我拥有的是: ViewMain.xaml:

<UserControl x:Class="WpfApplication3.Views.ViewMain"
         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" 
         mc:Ignorable="d" 
         xmlns:prism="http://prismlibrary.com/"
         prism:ViewModelLocator.AutoWireViewModel="True"
         d:DesignHeight="300" d:DesignWidth="300"
         >
<Grid>
      ...
      <Frame Content="{Binding MainGrid}" Margin="0,30,0,0" Height="{Binding GridHeight, Mode=OneWayToSource}" Width="{Binding GridHeight, Mode=OneWayToSource}"/>
</Grid>

在ViewMainViewModel.cs中:

...
public class ViewMainViewModel : BindableBase
{
    public DelegateCommand SizeUpdateCommand { get; set; }

    private Grid _mainGrid;
    public Grid MainGrid
    {
        get { return _mainGrid; }
        set { SetProperty(ref _mainGrid, value); }
    }
    private double _gridHeight = 300;
    public double GridHeight
    {
        get { return _gridHeight; }
        set { SetProperty(ref _gridHeight, value); }
    }
    private double _gridWidth = 420;
    public double GridWidth
    {
        get { return _gridWidth; }
        set { SetProperty(ref _gridWidth, value); }
    }
    public ViewMainViewModel()
    {
        Grid newGrid = new Grid();
        MainGrid = newGrid;
        SizeUpdateCommand = new DelegateCommand(Execute, CanExecute).ObservesProperty(() => GridHeight).ObservesProperty(() => GridWidth);
    }

    private void Execute()
    {
        SomeMethod();
    }

    private bool CanExecute()
    {
        return true;
    }
...

有人发现问题或我需要改变什么吗?

1 个答案:

答案 0 :(得分:1)

这不是Prism问题。这与如何在WPF中尝试绑定到Frame的高度/宽度有关。如果您只想通过命令跟踪ViewModel中帧的大小更改,那么我建议采用完全不同的方法。只需使用InvokeCommandAction:

    <Frame>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SizeChanged">
                <prism:InvokeCommandAction Command="{Binding SizeUpdateCommand}" TriggerParameterPath="NewSize" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Frame>

然后将DelegateCommand更改为:

public DelegateCommand<object> SizeUpdateCommand { get; set; }

    private void Execute(object size)
    {
        var newSize = (Size)size;
    }

    private bool CanExecute(object size)
    {
        return true;
    }

现在,只要帧大小发生变化,您的VM就会知道它。

P.S。不要在VM中创建或引用UI对象。甚至不是DependencyObject。摆脱MainGrid属性以及对Grid的任何引用。