![](/img/trans.png)
[英]WPF - Unable to bind properties of control in ContentPresenter to parent control
[英]bind properties of user control the properties of the parent user control wpf mvvm
我有一個UserControl“UsersGrid”,里面有一個gridview和一些其他對象。
<UserControl x:Class="MainMenu.Views.UsersGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ToggleSwitch="clr-namespace:ToggleSwitch;assembly=ToggleSwitch"
xmlns:ignore="http://www.galasoft.ch/ignore"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="ignore d"
d:DesignHeight="500" d:DesignWidth="250"
DataContext="{Binding UsersGrid, Source={StaticResource Locator}}"
>
<UserControl.Background>
<ImageBrush ImageSource="d:/images.jpg"/>
</UserControl.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<DockPanel Grid.Row="0"
Grid.Column="0"
Margin="3 3 3 3"
x:Name="panel_useri">
<DockPanel DockPanel.Dock="Top"
Margin="2">
<Label DockPanel.Dock="Left"
FontFamily="Times New Roman"
FontSize="16"
FontWeight="Bold"
Content="Utilizatori"
Margin="0,10,0,0" >
</Label>
<StackPanel Orientation="Vertical" DockPanel.Dock="Right" >
<Label Content="Activi"
FontSize="14"
HorizontalAlignment="Right"
FontWeight="DemiBold"
HorizontalContentAlignment="Center"
Padding="5,0"
Margin="0,0,0,0" />
<ToggleSwitch:HorizontalToggleSwitch
IsChecked="True"
VerticalAlignment="Top"
Margin="0,0,0,2"
HorizontalAlignment="Right"/>
</StackPanel>
</DockPanel>
<telerik:RadGridView x:Name="grid_users"
DockPanel.Dock="Bottom"
AutoGenerateColumns="False"
SelectionUnit="FullRow"
SelectionMode="Single"
FilteringMode="FilterRow"
IsReadOnly="True"
RowIndicatorVisibility="Collapsed"
ShowGroupPanel="False"
IsBusy="{Binding IsGridUsersBusy}"
ItemsSource="{Binding GridUsersTable}"
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl},AncestorLevel=1},Path=SelectedGridUsersRow, Mode=TwoWay}"
>
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn Header="Nume"
HeaderTextAlignment="Center"
Width="1*"
TextAlignment="Center"
DataMemberBinding="{Binding NumeUser}" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</DockPanel>
</Grid>
</UserControl>
第二個用戶控件是“UsersGrid”的父級,並且具有aloso其他對象...
<UserControl x:Class="MainMenu.Views.Test"
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:MainMenu.Views"
mc:Ignorable="d"
d:DesignHeight="500" d:DesignWidth="700"
DataContext="{Binding Test, Source={StaticResource Locator}}"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MaxWidth="200"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<local:UsersGrid x:Name="oUsers" Grid.Column="0" />
<DockPanel Grid.Column="1" >
<StackPanel>
<TextBox Text="here some value of item selected from gridview" />
</StackPanel>
</DockPanel>
</Grid>
</UserControl>
第二個UC的ViewModel:
namespace MainMenu.ViewModel {
public class TestViewModel : ViewModelBase {
public TestViewModel() {
}
private GridUsers_row _selectedGridUsersRow;
public GridUsers_row SelectedGridUsersRow
{
get { return _selectedGridUsersRow; }
set
{
_selectedGridUsersRow = value;
RaisePropertyChanged("SelectedGridUsersRow");
}
}
}
}
如何從第二個UC的ViewModel將SelectedItem從“telerik:RadGridView x:Name =”grid_users“”綁定到“SelectedGridUsersRow”?
您將擁有一個DataContext項,其中包含網格數據的項集合和Selected Item。
public class TestViewModel : ViewModelBase
{
public TestViewModel() { }
private ObservableCollection<User> _users;
public ObservableCollection<User> Users
{
get { return _users; }
set
{
_users= value;
RaisePropertyChanged("Users");
}
}
private User _selectedUser;
public User SelectedUser
{
get { return _selectedUser; }
set
{
_selectedUser= value;
RaisePropertyChanged("SelectedUser");
}
}
}
您的XAML看起來大致如下:
<UserControl x:Class="MainMenu.Views.Test" ...
DataContext="{Binding MyTestViewModel, Source={StaticResource Locator}}">
<Grid>
...
<local:UsersGrid x:Name="oUsers" Grid.Column="0" />
<DockPanel Grid.Column="1" >
<StackPanel>
<TextBox Text="{Binding SelectedUser.Name}" />
</StackPanel>
</DockPanel>
</Grid>
</UserControl>
<!-- Note that DataContext is NOT set here. Because it is not set,
<!--- it will use DataContext from parent item, which is TestViewModel -->
<UserControl x:Class="MainMenu.Views.UsersGrid" ...>
...
<telerik:RadGridView x:Name="grid_users"
ItemsSource="{Binding Users}"
SelectedItem="{Binding SelectedUser}"
...>
...
</UserControl>
第一個UserControl已經完成了一個ViewModel:
namespace MainMenu.ViewModel {
public class UsersGridViewModel : ViewModelBase {
public UsersGridViewModel() {
Init();
}
private void Init() {
using (var conn = new FbConnection(Config.connString)) {
//populate users grid
IEnumerable<GridUsers_row> c_useri = conn.Query(@"select aa.id, aa.nume, aa.dela
from useri aa
where aa.deleted=0 and aa.dela is not null
order by aa.nume")
.Select(row => new GridUsers_row() {
IdUser = row.ID,
NumeUser = row.NUME,
ldDela = row.DELA.ToString(),
});
Application.Current.Dispatcher.Invoke(() => {
GridUsersTable.Clear();
GridUsersTable.AddRange(c_useri);
});
}
}
//c_useri
private ObservableRangeCollection<GridUsers_row> _gridUsers = new ObservableRangeCollection<GridUsers_row>();
public ObservableRangeCollection<GridUsers_row> GridUsersTable
{
get { return _gridUsers; }
set
{
if (_gridUsers == value)
return;
_gridUsers = value;
RaisePropertyChanged("GridUsersTable");
}
}
}
}
如果我的兩個uc都有一個DataContent並且我不想要那個...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.