我有两个视图,一个是父视图(Ics视图),我在其中添加了子视图(侧视图)。在IcsView中,我已经为按钮添加文件和添加文件夹编写了代码,现在我想在子视图(即侧视图)中绑定该数据。
产品型号:
public partial class Data:ObservableObject
{
public string filePath { get; set; }
public String FilePath
{
get { return filePath; }
set { filePath = value; }
}
}
集成电路XAML:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ICSViewer.MVVM.View.IcsView"
xmlns:v="clr-namespace:ICSViewer.MVVM.View"
xmlns:model="clr-namespace:ICSViewer.MVVM.ViewModel"
>
<ContentPage.BindingContext>
<model:IcsViewModel/>
</ContentPage.BindingContext>
<ContentPage.MenuBarItems>
<v:SideView Grid.Column="0" Grid.RowSpan="3" />
IcsView代码隐藏:
private readonly IFolderPicker _folderPicker;
public static List<Data> Items = new List<Data>();
public IcsView(IFolderPicker folderPicker)
{
InitializeComponent();
_folderPicker = folderPicker;
}
private async void Add_File(object sender, EventArgs e)
{
var CustomFileType = new FilePickerFileType(new Dictionary<DevicePlatform, IEnumerable<String>>
{
{ DevicePlatform.WinUI, new[]{"ics"} },
});
var results = await FilePicker.PickMultipleAsync(new PickOptions
{
FileTypes = CustomFileType,
});
foreach (var result in results)
{
FileInfo fileInfo = new FileInfo(result.FullPath);
double size = fileSize(fileInfo);
bool fileExist = false;
foreach (Data item in Items)
{
if (item.FilePath.Equals(result.FullPath))
{
fileExist = true;
break;
}
}
if (!fileExist)
{
Items.Add(new Data
{
FilePath = result.FullPath,
});
}
else
{
await DisplayAlert("Alert", "File already exist!", "Ok");
}
}
}
public void getFiles(FileInfo path)
{
double size = fileSize(path);
bool fileExist = false;
foreach (Data item in Items)
{
if (item.FilePath.Equals(path.FullName))
{
fileExist = true;
break;
}
}
if (!fileExist)
{
Items.Add(new Data
{
FilePath = path.FullName,
});
}
}
public double fileSize(FileInfo file)
{
double fileSize = file.Length;
double sizeMb = fileSize * 0.000001;
return Math.Round(sizeMb, 2);
}
侧视图
<StackLayout>
<Label Text="{Binding SideModel.HeaderText}" FontSize="18" FontAttributes="Bold" Padding="5" />
<CollectionView ItemsSource="{Binding Source={x:Reference childView }, Path=icsViewModel.Items}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Label Text="{Binding FilePath}"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
这是侧视图后面的代码
public string FilePath
{
get
{
string value = (String)GetValue(FilePathProperty);
return value;
}
set
{
SetValue(FilePathProperty, value);
}
}
static void OnFileNameChanged(BindableObject bindable, object oldValue, object newValue)
{
Console.WriteLine("-----------------> " + newValue);
}
public static readonly BindableProperty MyViewModelProperty =
BindableProperty.Create(
nameof(IcsViewModel),
typeof(IcsViewModel),
typeof(SideView),
null);
public static readonly BindableProperty FilePathProperty = BindableProperty.Create(nameof(File)
, typeof(Data)
, typeof(SideView), defaultBindingMode: BindingMode.TwoWay, propertyChanged: OnFileNameChanged);
public IcsViewModel icsViewModel
{
set { SetValue(MyViewModelProperty, value); }
get { return (IcsViewModel)GetValue(MyViewModelProperty); }
}
public SideView()
{
InitializeComponent();
}
更新的视图模型:我还没有在这里添加set方法,我也不知道我应该怎么在这里添加这个属性,所以你能看一遍吗?
名称空间DataBinding.MVVM.ViewModel {内部局部类ParentViewModel:信息属性已更改{
public ObservableCollection<Data> Item { get; set; }
public ParentViewModel()
{
Item = new ObservableCollection<Data>();
}
[RelayCommand]
public async void Add_File()
{
var CustomFileType = new FilePickerFileType(new Dictionary<DevicePlatform, IEnumerable<String>>
{
{ DevicePlatform.WinUI, new[]{"ics"} },
});
var results = await FilePicker.PickMultipleAsync(new PickOptions
{
FileTypes = CustomFileType,
});
foreach (var result in results)
{
FileInfo fileInfo = new FileInfo(result.FullPath);
double size = fileSize(fileInfo);
bool fileExist = false;
foreach (Data item in Item)
{
if (item.name.Equals(result.FullPath))
{
fileExist = true;
break;
}
}
if (!fileExist)
{
Item.Add(new Data
{
name = result.FullPath,
});
}
else
{
Item = Item;
}
}
}
public void getFiles(FileInfo path)
{
double size = fileSize(path);
bool fileExist = false;
foreach (Data item in Item)
{
if (item.name.Equals(path.FullName))
{
fileExist = true;
break;
}
}
if (!fileExist)
{
Item.Add(new Data
{
name = path.FullName,
});
}
}
public double fileSize(FileInfo file)
{
double fileSize = file.Length;
double sizeMb = fileSize * 0.000001;
return Math.Round(sizeMb, 2);
}
bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Object.Equals(storage, value))
return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
如果选择特定文件,则希望在侧视图中填充该文件或文件夹,但无法将数据从IcsView.xaml.cs绑定到sideview.xaml.cs
2条答案
按热度按时间4c8rllxm1#
我基于MVVM实现了你的功能。它在我这边工作。
可以参考下面的代码:
我的视图模型.cs
数据.cs
子视图.xaml
子视图.xaml.cs
主页面.xaml.cs
主页.xaml
备注:
1.请在文件
AndroidManifest.xml
中添加权限:2.实际上,要实现这样的功能,并不需要单独新建一个
ContentView
(ChildView
),增加代码的难度,直接将ListView
添加到父页面即可。您可以在此处查看实现此功能的另一种方法:无法检测到活动窗口。请确保已在Application类中调用了Init。
icomxhvb2#
我有两个视图,一个是父视图(Ics视图),我在其中添加了子视图(侧视图)
如果
side View
包含在父视图(Ics view
)中,常用的方法是引用父视图的视图模型中的父变量。在这种情况下,可以在
side View
中创建BindableProperty
。我创建了一个简单的演示来模拟这个问题(我的父视图是
MainPage
,子视图是ChildView
)。可以参考下面的代码:
MainPage.xaml.cs
MainPage.xaml
MyViewModel.cs
ChildView.xaml
ChildView.xaml.cs
备注:
1.在这里,我为
MainPage
创建了一个视图模型MyViewModel
,在视图模型中,我为ChildView创建了一个变量TestName
,并为MyViewModel
实现了接口INotifyPropertyChanged
。一旦修改了TestName
的值,UI将在ChildView
上自动刷新。2.如果要在
ChildView
中添加一个ListView
,可以在ChildView.xaml.cs
中添加一个新的BindablePropertyMyViewModelProperty
,在ViewModelMyViewModel
中添加一个ObservableCollection Items
更新日期:
我看不到你的应用程序的其他代码,但从你张贴的代码,我发现有几个问题。
1.you 可以重新检查您是否已为页面
IcsView
设置了BindingContext
。例如:
2.you 可以调试以查看您是否在ViewModel中获得了
Items
的更新数据。您还需要更改代码:
至
并在视图模型的构造函数中初始化它。
3.您的自定义属性
icsViewModel
使用不正确。可系结属性的命名惯例是,可系结属性识别码必须符合Create方法中指定的属性名称,并附加“Property”。如需详细信息,请核取:建立可系结属性。
可以参考下面的代码: