viewModel的绑定属性

时间:2018-09-20 07:33:13

标签: c# mvvm datagrid viewmodel

早上好,我在客户服务器上的C#页面出现问题。 我的页面分为两部分:左侧有一个对象列表,而右侧有一个表,其中显示了所选对象的详细信息。在右侧显示的字段中,有一个指向用户可以下载的一个或多个文件(与对象有关)的链接。根据某些条件,我想阻止某些用户下载这些文件,只让他们看到文件名。

在xaml中,我创建了一个DataGrid来显示定义如下的对象的详细信息:

<DataGrid AutoGenerateColumns="False" Name="dgRPD" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" ItemsSource="{Binding ListRPD}" SelectedItem="{Binding SelectedRPD}" Height="Auto"> 

该列的代码如下:

<DataGridTemplateColumn Header="Files" Width="Auto" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <cc:FilePickerOnlyName CanChooseFile="False" FileName="{Binding Path=FileNameDoc}" FilePath="{Binding Path=PathDoc, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding hide, UpdateSourceTrigger=PropertyChanged}" DataContext="{Binding}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我的想法是使用IsEnabled属性实现我的目标,如果将其设置为False,我就会理解。因此,我创建了一个属性“ hide”,定义如下:

private bool _hide;
public bool hide
{
    get { return _hide; }
    set
    {
        if (_hide != value)
        {
            _hide = value;
            RaisePropertyChanged("hide");
        }
    }
}

要尝试这种方法,我会在ViewModel的初始化过程中将hide设置为false,并且每次在页面左侧更改所选对象并手动强制RaisePropertyChange进行隐藏时。 我尝试禁用字段时,在检索对象列表或对象详细信息时没有问题。我在google上搜索了isEnabled Binding的路径的所有变体,但没有任何效果。 我该如何解决?

1 个答案:

答案 0 :(得分:0)

在同事的帮助下,我解决了这个问题;我将IsEnabled更改如下:

IsEnabled="{Binding ElementName=root, Path=ViewModel.hide}" 

,并且在XAML开头的UserControl标记中,添加了以下几行:

xmlns:local="clr-namespace:[namespace of the ViewModel]"
x:Name="root"

,现在可以使用了。在回答@Blacktempel和@Juan Carlos Rodriguez的评论时,hide属性在ViewModel中被声明为公共布尔,但与左列的对象或页面右侧的对象的详细信息没有直接关系,因为在在这两种情况下,它们都是非常大而复杂的外部类的一部分,我无法访问或修改其源代码。我还想最小化使程序正常运行所需的更改。