从 viewModel 绑定 属性
Binding property from viewModel
早上好,我在客户服务器上使用 C# 编写的页面有问题。
我有一个页面分为两部分:左边是对象列表,右边是 table,它显示了所选对象的详细信息。在右侧显示的字段中,用户可以下载一个或多个文件(与对象相关)的 link。基于某些条件,我想阻止某些用户下载这些文件,让他们只能看到文件名。
在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 进行隐藏。
我在检索对象列表或对象的详细信息时没有问题,只是在我尝试禁用这些字段时。我用谷歌搜索并搜索了 isEnabled 绑定路径的任何变体,但没有任何效果。
我该如何解决?
在同事的帮助下,我解决了这个问题;我按如下方式更改了 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 的评论,隐藏 属性 在 ViewModel 中被声明为 public bool 但与左列的对象或对象的详细信息没有直接关系页面的右侧部分,因为在这两种情况下,它们都是非常大且复杂的外部 class 的一部分,我无法访问或修改其源代码。我还想最小化使程序运行所需的更改。
早上好,我在客户服务器上使用 C# 编写的页面有问题。 我有一个页面分为两部分:左边是对象列表,右边是 table,它显示了所选对象的详细信息。在右侧显示的字段中,用户可以下载一个或多个文件(与对象相关)的 link。基于某些条件,我想阻止某些用户下载这些文件,让他们只能看到文件名。
在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 进行隐藏。 我在检索对象列表或对象的详细信息时没有问题,只是在我尝试禁用这些字段时。我用谷歌搜索并搜索了 isEnabled 绑定路径的任何变体,但没有任何效果。 我该如何解决?
在同事的帮助下,我解决了这个问题;我按如下方式更改了 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 的评论,隐藏 属性 在 ViewModel 中被声明为 public bool 但与左列的对象或对象的详细信息没有直接关系页面的右侧部分,因为在这两种情况下,它们都是非常大且复杂的外部 class 的一部分,我无法访问或修改其源代码。我还想最小化使程序运行所需的更改。