我有一个 UserControl 和 ViewModel,在单击 CheckConfigurationCommand 按钮后它需要显示一条消息(TextBlock)。消息的内容取决于 nameFile.config 文件是否打开。如果文件已打开,则单击按钮后,应显示消息:“打开的文件:带 DC 的 nameFile.config 已打开。”。 如果文件未打开,则消息应显示:“打开的文件:带 DC 的 nameFile.config 未打开。”。
使用我的代码,它只显示一条消息,文件已打开,但文件未打开,你能告诉我错误在哪里吗?
这是我的 XAML 和 ViewModel:
XAML:
<UserControl x:Class="PTC_Konfiguration.View.ConfigurationReviewUserControl"
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:PTC_Konfiguration.View"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="Opened File:" />
<TextBlock Text="{Binding OpenedFilePath}" FontWeight="Bold" FontSize="16" />
<Button Content="Check Configuration" Command="{Binding CheckConfigurationCommand}" />
</StackPanel>
</Grid>
</UserControl>
视图模型:
private string openedFilePath;
public event PropertyChangedEventHandler PropertyChanged;
public string OpenedFilePath
{
get { return openedFilePath; }
set
{
if (openedFilePath != value)
{
openedFilePath = value;
OnPropertyChanged();
}
}
}
public ICommand CheckConfigurationCommand { get; }
public ConfigurationReviewViewModel()
{
CheckConfigurationCommand = new RelayCommand(CheckConfiguration);
}
private void CheckConfiguration()
{
string filePath = @"C:\Users\Path";
if (FileIsOpen(filePath))
{
OpenedFilePath = "Opened File: The nameFile.config with DC is open.";
}
else if (FileIsNotOpen(filePath))
{
OpenedFilePath = "Opened File: The nameFile.config with DC is not open.";
}
}
private bool FileIsOpen(string filePath)
{
return File.Exists(filePath);
}
private bool FileIsNotOpen(string filePath)
{
try
{
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
{
fs.Close();
return false;
}
}
catch (IOException)
{
return true;
}
}
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
File.Exists()
方法中写的FileIsOpen()
方法是检查文件是否存在的方法。
如果我没理解错的话,
FileIsOpen()
想要判断是否因为文件打开而出现死锁。
没有理由有两种方法。我认为你只需要反转
FileIsNotOpen()
方法中的返回值即可。
我觉得一个
IF
就够了。
private void CheckConfiguration()
{
string filePath = @"C:\Users\Path";
if (FileIsOpen(filePath))
{
OpenedFilePath = "Opened File: The nameFile.config with DC is open.";
}
else
{
OpenedFilePath = "Opened File: The nameFile.config with DC is not open.";
}
}
private bool FileIsOpen(string filePath)
{
try
{
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
{
fs.Close();
}
}
catch (IOException)
{
return false;
}
return true;
}
我希望这是您想要的功能。