Я долго пытался понять, как решить вашу проблему, и, хотя я не совсем доволен результатом, мне удалось его решить.
Сначала я создаю ListBox с DummyList, которыйсодержит Model-Objects с именем 'UserControlModel' с отдельным свойством 'modelWidth', из которого я создаю свои UserControls с размером по умолчанию.
<ListBox ItemsSource="{Binding SimpleList, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Width="Auto" Height="200">
<ListBox.ItemTemplate>
<DataTemplate>
<osv:UserControl1 Width="{Binding modelWidth}" OnTextValidated="UserControlSizeChangeEvent"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
OnTextValidated - это RoutedEvent для передачи KeyDown-Event из моего текстового поляв мое окно (которое я покажу позже) UserControl1.xaml затем добавляет текстовое поле
<TextBox Width="60" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" KeyDown="TextBox_KeyDown" Text="{Binding myText, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"></TextBox>
с событием KeyDown и текстовой привязкой.
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)//press enter to change
{
if (double.TryParse(myText, out double d) == true)
{
if (d >= 50) //minimum width, so i won't set it to 0 by accident
{
myWidth = d; //set the new Width
OnTextValidated(this, new RoutedEventArgs()); //tell window to resize the UserControl
}
}
}
}
Как только я проверил новый размерне является ни неправильным, ни слишком маленьким, я вызываю RoutedEventHandler
private RoutedEventHandler m_OnTextValidated;
/// <summary>
///
/// </summary>
public RoutedEventHandler OnTextValidated
{
get { return m_OnTextValidated; }
set
{
m_OnTextValidated = value;
OnPropertyChanged("CustomClick");
}
}
, теперь я могу связать это, как показано выше.
Далее я должен передать свое событие из xaml.cs.в MinWindowViewModel
//Variables
private MainWindowViewModel m_DataContext;
//Constructor
DataContext = new MainWindowViewModel ();
m_DataContext = (MainWindowViewModel)this.DataContext;
private void UserControlSizeChangeEvent(object sender, RoutedEventArgs e)
{
if (m_DataContext != null)
{
m_DataContext.UserControlSizeChangeEvent(sender, e);
}
}
и, наконец, обновите размер моего объекта в моем коде позади
public void UserControlSizeChangeEvent(object sender, RoutedEventArgs e)
{
UserControl1 uc = sender as UserControl1;
uc.Width = uc.myWidth;
}
Примечание: Although это работает довольно хорошо, я был бы намного счастливее, если бы нашел способ изменить ширину модели вместо объекта, чтобы они все равно имели такую же ширину в случае перерисовки списка.Я также не использовал шаблон MVVM для моего UserContrl, поэтому вам нужно сначала передать событие из вашего xaml.cs в вашу модель представления, как я это сделал для MainWindow