WPF: найдите родительское окно из ListView ViewBase

У меня есть ListView, который позволяет пользователю изменять ViewBase через контекстное меню (он действует как упрощенная версия проводника Windows).

 <ListView Name="lv" Grid.Row ="0" Grid.Column ="1"  >
        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem Header="View1" Click="SwitchViewMenu"/>
                <MenuItem Header="View2" Click="SwitchViewMenu"/>                   
            </ContextMenu>
        </ListView.ContextMenu>
        <ListView.View>
            <local:View1 />
        </ListView.View>
    </ListView>

Шаблоны данных ViewBases определены в файле Generic.XAML, и я использую следующую функцию для изменения выбранного представления:

 void ChangeView(string str)
    {
        if (str == "View1")
        {
            lv.View = lv.FindResource("View1") as ViewBase;
        }
        else if (str == "View2")
        {
            lv.View = lv.FindResource("View2") as ViewBase;
        }
    }

Эта проблема:

Я получил пользовательский элемент управления CheckBox во всех шаблонах данных, к которому прикреплено предварительно определенное событие нажатия, однако, когда я пытаюсь переместиться вверх по родительскому элементу CheckBox,наивысшим уровнем, которого я могу достичь, является сетка родительских элементов в используемом шаблоне данных.

Мне нужен доступ к самому Родительскому окну.

Примечание. Я попытался добавить свойство зависимости в пользовательский элемент управления CheckBox и связать его с дополнительной определенной переменной в отправляемом объекте (объект DataType элементов данных), для которого в качестве значения была ссылка на окно, но я продолжал получать значение NULL, хотя все другие свойства / значения зависимости были связаны.

1 ответ

Решение

Это зависит от того, как вы пытаетесь добраться до родителей. Я настоятельно рекомендую эту статью (Джош Смит), чтобы получить реальное представление о том, что происходит в WPF.

Тем не менее, вы можете попробовать Window.GetWindow(myControl); (статический метод); это должно работать для любых чистых деревьев WPF (для взаимодействия с WinForms, см. это).

Другие вопросы по тегам